問題タブ [destruction]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - Ruby で返された関数値にアクセスする
次の関数を検討してください。
とが変数であると仮定して、a
1 と2 を等しく設定するにはどうすればよいですか?b
a
b
a=1
andをお勧めしないでください。b=2
要点は、関数が返したものにアクセスする方法を理解することです。
c++ - void ポインタの削除時にデストラクタが呼び出されない
私は3つのクラスを持っています
C
クラスの子のコンテナとしてクラスを使用し、インスタンスA
を削除しようとすると。、デストラクタが呼び出されていないのは正常ですか? 解決策は何ですか?C
A
B
map - マップとキーワード引数の破棄を適用する Clojure
次のシグネチャを持つ関数を考えてみましょう。
マップを関数に渡す最良の方法は何ですか?
また
私が現在考えているのは経由vec
でflatten
あり、apply
例えば:
これを行うためのより良い方法があると強く信じています。ひとつご検討いただけますか?
c++ - 基本クラスはどのような順序で破棄されますか?
次のように、3 つのクラスのクラス構造があり、そのうちの 2 つは 3 番目の基本クラスです。
のインスタンスC
が破棄される場合、基本クラスA
とB
破棄される順序は? これに関する規則はありますか?
c++ - 初期化されていないストレージを許可するベクトルを構築する
std::vector とは異なり、初期化されていないストレージを許可するベクターコンテナーを構築したいとしましょう。たとえば、コンテナの使用法は、vec <T>
おおよそ次のようになります。
ユーザーは、ベクトルが N 個の初期化されていない要素を次のように割り当てる必要があると明示的に述べています。
vec <T> a(N, no_init);
データが既知の時点で、ユーザーは
n
引数を使用して position で要素を明示的に初期化しますargs...
。a.init(n, args...);
または、同等に、要素を手動で構築します。
new (&a[n]) T(args...);
他の操作は、より大量に初期化またはコピーする場合があります ( など
std::uninitialized_copy
) が、これは便宜上のものにすぎません。基本的な操作は同じです。いくつかのタスクを完了した後、ベクトルには初期化された要素と初期化されていない要素が残る場合があります。ベクトルは余分な情報を保持しないため、最終的にはメモリを解放する前に、とにかくすべての要素を破棄するか、に応じてのみ破棄し
T
ます。
私はこれができると確信していますが、結果についてはわかりません。T
当然のことながら、ユーザーが構築前に初期化されていない要素を使用しようとしないことを前提として、この構造がすべての型に対して安全であることを望みます。これは強い仮定のように聞こえるかもしれませんが、ベクトルの範囲内でのみ要素にアクセスすることは、それほど異なる仮定ではなく、非常に一般的です。
だから私の質問は:
のように、この種の初期化されていない操作を許可しても安全なのはどのタイプ
vec <T> a(no_init)
ですか? 私is_pod
は大丈夫だと思いますし、おそらくそうis_trivial
です。必要以上の制約を加えたくありません。破棄は常に実行する必要がありますか、それとも一部の型に対してのみ実行する必要がありますか? 上記と同じ制約で問題ありませんか? どう
is_trivially_destructible
ですか?構築されていない要素を破棄したり、その逆 (構築された要素を破棄しない) が害を及ぼすべきではないという考え方です。ユーザーにより多くの責任を負わせる明らかなリスク以外に、この試みに重大な欠陥はありますか?
要点は、ユーザーがパフォーマンスのためにそのような機能を必要とする場合、低レベルのソリューションstd::get_temporary_buffer
や手動割り当て (たとえば を使用operator new()
) は、リークに関してよりリスクが高い可能性があるということです。私は知ってstd::vector::emplace_back()
いますが、それは実際には同じことではありません。
c++ - std::unique_ptr のツリー構造ベクトルの破棄
std::unique_ptr を使用するようにコードを移行しています。
ツリー階層を持つ 1 つのクラスについて決定しなければならなかったとき、ツリーからオブジェクトを削除するとそのオブジェクトが削除されるように、オブジェクトがその子を所有できるようにすることにしました。ただし、何千もの要素の複雑な階層では、それを破壊するのが非常に遅いことに気付きました。のように、信じられないほど遅い。
一意のポインターのベクトルをネストしないことをお勧めします。unique_ptr のフラット レイアウトに切り替えて、通常のポインターをツリーに保持する必要がありますか? これがダメだということはよく知られている事実かもしれないと想像していますが、この特定の詳細に関する文献を見つけるのに苦労したので、私は困惑しています.
更新:私の質問を削除するかどうかについて長い間ためらった後、私の問題がこれに非常に似ていることに気付きました: ポインタのSTLベクトルのエントリを削除する高速な方法
さらに、ツリー構造ではプロセスがさらに遅くなります。unique_ptr
結局のところ、ここでは責任を負っていないようです。
私はそれを調査するためにコードを書きました
60,000 要素の破棄
unique_ptr
、フラット レイアウトには約 5 秒かかります60,000 個の要素を破壊する
unique_ptr
、ツリー レイアウトには約 8 秒かかります
unique_ptr を使用しない場合、時間はわずかに短くなります。
したがって、私が直面している実際の問題は、60 000 個のものを連続して削除するのが遅いということです。次に、私の解決策は、リンクされた質問のものと似ていると思います:
バッチで削除することがわかっている要素のメモリをプールしますが、非常に面倒で重大なエラーが発生しやすいと言われています
ワーカー スレッドに実行させます。つまり、低速のままですが、メイン スレッドを妨げません。
私は両方を適切に実行する方法について技術的に精通していませんが、それは私を教育すると思います.