問題タブ [placement-new]
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.
c++ - 「新しい配置」にはどのような用途がありますか?
C++ の「placement new」を使用したことがある人はいますか? もしそうなら、何のために?メモリマップされたハードウェアでのみ役立つように思えます。
c++ - CUDA: C++ でのデバイス メモリ割り当てのラッピング
私は現在 CUDA を使い始めており、C API に少しがっかりしていることを認めなければなりません。C を選択した理由は理解できますが、代わりに言語が C++ に基づいていた場合、デバイス メモリの割り当て (経由cudaMalloc
) など、いくつかの側面がより単純になったはずです。
operator new
私の計画は、オーバーロードされた配置new
と RAII (2 つの選択肢)を使用して、これを自分で行うことでした。今まで気付かなかった注意点があるのではないかと思っています。コードは機能しているように見えますが、メモリ リークの可能性についてまだ疑問に思っています。
RAIIコードの使用法は次のようになります。
おそらく、このコンテキストではクラスがやり過ぎなので(特に、cudaMemcpy
RAIIをカプセル化するだけのクラスを使用する必要があるため)、他のアプローチは配置new
になります:
ここでは、cudaDevice
単にオーバーロードをトリガーするタグとして機能します。ただし、通常の配置でnew
はこれは配置を示しているため、構文が奇妙に一貫しており、おそらくクラスを使用するよりも好ましいとさえ思います。
あらゆる種類の批判をいただければ幸いです。この方向の何かがCUDAの次のバージョンで計画されているかどうか誰かがおそらく知っていますか(私が聞いたように、それが意味するものは何でも、C++サポートが改善されます)。
したがって、私の質問は実際には 3 つあります。
- プレースメントの
new
オーバーロードは意味的に正しいですか? それはメモリをリークしますか? - この一般的な方向に進む将来の CUDA 開発に関する情報を誰かが持っていますか (それに直面しましょう: C++ s*ck の C インターフェイス)?
- これを一貫した方法でさらに進めるにはどうすればよいですか (他にも考慮すべき API があります。たとえば、デバイス メモリだけでなく、定数メモリ ストアとテクスチャ メモリもあります)。
ここで採用されているシングルトンについて: はい、その欠点は認識しています。ただし、これらはこのコンテキストには関係ありません。ここで必要だったのは、コピーできない小さなタイプのタグだけでした。他のすべて (つまり、マルチスレッドの考慮事項、初期化の時間) は適用されません。
c++ - 可変サイズのクラス - C++
このように定義されたクラスであるクラスを見てきました..
静的ファクトリ関数には、次の実装があります。
私が理解している限り、この関数は新しい配置を使用してこのクラスを拡張しています。
メンバーが1つしかなく、ヒープに割り当てられているため、これは安全ですか?
c++ - 配置で初期化された POD クラスの新しいデフォルトが初期化されましたか?
配置 new で POD クラスを初期化すると、メモリがデフォルトで (ゼロに) 初期化されると想定できますか? このリソースには、ゼロ引数のデフォルト コンストラクターを明示的に呼び出すとフィールドがデフォルトで初期化されることが明確に示されていますが、placement new (アドレスを渡す) のデフォルトの実装を使用してこれが当てはまるかどうかは明確ではありません。この場合、メモリがゼロになるのは標準的な動作ですか?
c++ - これらの配置の新しいマクロは正しいですか?
プレースメント new の使用を少し簡単にするために、いくつかのマクロを作成しました。これらが機能しない明らかなケースがあるかどうか疑問に思っていました. ありがとう。
c++ - メモリ内で可変サイズの構造体を連続して割り当てるにはどうすればよいですか?
私は C++ を使用しており、次の構造を持っています。
メモリ内では、各 DataPoint の最後に 1 つ以上の ArrayOfThese 要素が必要です。DataPoint ごとに常に同じ数の ArrayOfThese 要素があるとは限りません。
膨大な数の DataPoint を集めてネットワーク経由でストリーミングする必要があるため、すべての DataPoint とその ArrayOfThese 要素を連続させたいと考えています。固定数の ArrayOfThese 要素のためにスペースを浪費することは容認できません。
C では、DataPoint の最後に として宣言された要素を作成しArrayOfThese d[0];
、DataPoint に加えて、多くの ArrayOfThese 要素に十分な余分なバイトを割り当て、ダミー配列を使用してそれらにインデックスを付けます。(もちろん、ArrayOfThese 要素の数は DataPoint のフィールドにある必要があります。)
C++ では、新しい配置と同じ長さ 0 の配列ハックを使用して正しいアプローチをとっていますか? もしそうなら、配置 new は、同じメモリプールからの new への後続の呼び出しが連続して割り当てられることを保証しますか?
c++ - 配置の魔法は新しいですか?
私は「手動で」動的メモリ割り当てを使用していて、MSの人が新しい配置をどのように実装するかを確認したかったのですが、デバッグ時に「ステップイン」してコードに移動しました。
このコードで見ることができるのは、引数として指定したものを含むreturnステートメントの行だけである場合に、このコードがオブジェクトをポインターが指す場所に配置する方法を誰かに説明してもらえますか?コメントでこのfncに何をしてほしいかを言うだけでは、実際には十分ではないと思います。建設的な回答ありがとうございます。
c++ - voidポインタバッファからの構造体のインスタンス化
これが私には面白そうなC++コードですが、動作することはわかっています。
構造体が定義されており、プログラムではvoidポインタを使用してメモリを割り当てます。次に、割り当てられたバッファを使用して構造体が作成されます。
ここにいくつかのコードがあります
コードにはもっと多くのものがありますが、それがその要点です。
私はこのコードをテストしていませんが、私が見ているコードは非常によくテストされており、機能します。しかし、どのように?
ありがとう。
編集:そのメモリリークを修正しました。