問題タブ [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.

0 投票する
1 に答える
394 参照

c++ - 配置の新しいオペレーターをオーバーロードするための追加コストはいくらですか?

使用されているメモリサイズが特定のクラスに十分であることを確認するために、配置の新しい演算子をオーバーロードしたいと思います。私たちはこのサイズを知っています。構造は多かれ少なかれこのようになっています:

そのような単純化されたコンテキストで使用されるとしましょう:

テストフェーズでは、このPlacementNewTest <>クラスを使用していますが、リリースコードでは削除することを検討しています。あなたの経験に基づいて、この余分なテストクラスを削除しないで、これは私たちのパフォーマンスにどれくらいの費用がかかると思いますか?これはこの検証の唯一のコストif (size > MAXSIZE)ですか?言い換えると、そのような再定義に対するパフォーマンスのペナルティは何ですか。

たぶん、この質問では重要ではありませんが、これはC ++ 03であり、そうである必要があります。C++11にアップグレードすることはできません。また、ブーストもオプションではなく、C++03だけです。

0 投票する
5 に答える
6938 参照

c++ - 配置の新しい演算子を使用する場合、配置について本当に心配する必要がありますか?

これを読みまし た アライメントについていつ心配する必要がありますか? しかし、次の例のように、placement new 演算子によって返される整列されていないポインターについて心配する必要があるかどうかはまだわかりません。

__alignof(A) == 4、 に(buffer + 1)位置合わせされていません4。しかし、すべて正常に動作します - 完全な例はこちら: http://ideone.com/jBrk8

これがアーキテクチャに依存する場合、私は使用しています: linux/powerpc/g++ 4.xx

[更新] この質問を投稿した直後に、次の記事を読みました: http://virtrev.blogspot.de/2010/09/memory-alignment-theory-and-c-examples.html。おそらく、私の場合の唯一の欠点はパフォーマンスの低下でしょう。

0 投票する
1 に答える
931 参照

c++ - C ++:新しい配置が独自の新しいオーバーロードと衝突する

Xあるタイプのメモリプールを使用するために、新しい演算子をオーバーロードしました。私のnew演算子はユーザー定義の引数を取りません。したがって、唯一の引数はタイプのオブジェクトのサイズですsize_t。プログラムの別の部分では、次のように、同じタイプの新しい配置が必要です。

(ここで、ptrは事前に割り当てられたメモリ位置へのポインタです)

タイプシャドウ配置の新しい演算子のオーバーロードが新しいようです。少なくとも、コンパイラは次のように文句を言います。

候補は、新しい演算子の私の過負荷です。私の質問は次のとおりです。

  • 新しい配置を使用したいことをコンパイラが認識しないのはなぜですか?
  • とにかくそれをどのように使用できますか?
  • WTFはX*&エラーメッセージに表示されるタイプですか?
0 投票する
1 に答える
1839 参照

c++ - C++配置の複数の引数新しい'コンストラクタ'

カスタムメモリトラッキング(リーク防止、破損検出)を行うには、新しい配置を使用してC ++オブジェクトを作成する必要があります。これは正常に機能しますが、コンストラクターに引数を渡す方法を理解するのに苦労しています。マクロから呼び出されるため(ファイル+行を自動的に提供できるように)。

関数:

これは、マクロを介して呼び出されます。

新規配置:

va_listマクロは、可変数の引数の拡張をカバーしますが、コンストラクターが持つ引数の数を指定したくない場合は、va_arg()を削除し、va_start()を使用できません。これは、フォーマットを想定しているためです。

これは私の頭を少し超えました:http ://www.drdobbs.com/cpp/calling-constructors-with-placement-new/232901023?pgno = 2

__VA_ARGS__new_objectから使用して、それらを構築関数に渡す方法はありますか?各オブジェクトにはコンストラクターが1つしかありませんが、さまざまなパラメーターを使用するさまざまなタイプのオブジェクトがあるため、手動によるメンテナンスを可能な限り削除したいと思います。

それとも、私が試みていることを一般的に行うためのより良い方法がありますか?

0 投票する
2 に答える
2252 参照

c++ - ベクトル内の要素を置き換えるために、placement-new と vector::data() を使用できますか?

代入できないベクトル要素の置換について、2 つの既存の質問があります。

オブジェクトが代入不可になる一般的な理由は、そのクラス定義にconstメンバーが含まれているためにoperator=削除されていることです。

std::vectorその要素型が代入可能である必要があります。実際、少なくとも GCC を使用すると、オブジェクトが代入可能でない場合、直接代入 ( ) も、要素を置換するとvec[i] = x;の組み合わせも機能しません。erase()insert()

vector::data()、要素の直接破壊、コピー コンストラクターでの配置 new を使用する次のような関数を使用して、未定義の動作を引き起こすことなく要素を置き換えることができますか?

使用中の関数の例を以下に示します。これは GCC 4.7 でコンパイルされ、動作するようです。

0 投票する
1 に答える
972 参照

c++ - なぜオペレーターの新機能 - 配置フォームはクラスレベルでOKなのですか?

C++ 11 (c++98/03 標準にも当てはまります) 標準 (以下を参照) から、既に定義されているため、新しい関数の演算子をグローバル空間に配置することはできません。

18.6.1.3 配置フォーム [new.delete.placement]

これらの関数は予約済みです。C++ プログラムは、標準 C++ ライブラリ (17.6.4) のバージョンを置き換える関数を定義できません。(3.7.4) の規定は、演算子 new および演算子削除のこれらの予約配置形式には適用されません。

これは、以下のスニペットのポイント 2> によって証明されており、予想どおりにコンパイル エラーが発生します。

しかし、クラスレベルで新しい配置をオーバーライドすることはできます。これは正常に機能します。以下のスニペットのポイント (2) を参照してください。何故ですか?標準に従って、(2) も防止しようとするべきではありません。

以下のスニペットを参照してください。

以下は、期待どおりの出力です。

================================================== ================================ 私の質問に対するさらなる説明:

18.6.1.3 配置形式これらの関数は予約されています。C++ プログラムは、標準C++ ライブラリ (17.6.4)のバージョンを置き換える関数を定義できません 。(3.7.4) の条項は、これらの予約済み配置フォームには適用されません。

operator new および operator delete の。

これは、私のスニペットのポイント <2> で予想されるコンパイル エラーを説明しているので、これは問題ありません。

しかし、クラスの明確化内のポイント (2) でクラス レベルのプレースメント フォームを置き換えることができるのはなぜですか?

0 投票する
1 に答える
396 参照

c++ - sizeof とplacement new を組み合わせても安全ですか?

次のクラスを検討してください。

これには問題があることはわかっていますが、議論のためにコードを短くするために、オブジェクトがスコープ外になる前に常に defer::construct() が呼び出されると仮定します。

そうは言っても、これを行うことは常に安全ですか?または、他の狂気を伴う複数の仮想継承の奇妙なコーナーケースで、 std::uint8_t[sizeof(T)] が十分なスペースを割り当てられないことがありますか?

0 投票する
2 に答える
714 参照

c++ - destruct + move構文によるムーブ代入は安全ですか?

ムーブコンストラクタを使用して、ほとんどすべてのクラスのムーブ代入を定義する非常に簡単な方法は次のとおりです。

独自のデストラクタを呼び出してから、このポインタに新しい配置を行うというこのシーケンスは、標準のC ++ 11で安全ですか?

0 投票する
2 に答える
161 参照

c++ - コンストラクタ引数に依存しないオブジェクト ポインタの作成

コンテナ Vector のようなベクターを作成しようとしています。

次に、次のように宣言しました。

メモリの割り当て中に、 A にデフォルトのコンストラクターがないというコンパイル エラーが発生します。メモリを割り当てるために次のコードを書きました。

T はテンプレート変数です。

エラーは、A のデフォルト コンストラクターを作成していないのに、新しい配置で T のデフォルト コンストラクターを使用しているという事実によるものです。

知りたいのですが、メモリ割り当てがコンストラクターの署名に依存しないようにする方法はありますか。

0 投票する
1 に答える
157 参照

c++ - 再帰的な配置割り当て

再帰的な配置割り当てを行うことは可能ですか?
このクラスがある場合:

特定のバッファに動的に割り当てたいのですが、m_field2 がそのバッファに割り当てられすぎて、「A」内で定義するすべてのオブジェクトも割り当てられてしまいます。
それはできますか?