C++でオブジェクト(クラスまたは構造体のインスタンス)を初期化する方法はさまざまです。一部の構文ではオブジェクトの直接初期化が表示され、その他の構文ではコピー初期化が返されます。コンパイラでcopy-elisionが有効になっている場合、どちらも同じパフォーマンスを示します。 copy-elisionを無効にすると、後者(コピー初期化)を選択したときに、すべてのインスタンス化時に追加のコピー/移動コンストラクタ呼び出しがあります。ダイレクト初期化またはコピー初期化ですか?
結論:コピー初期化にはパフォーマンス上のペナルティがあります。次の質問から
:C++11 member initializer list vs in-class initializer?私は、これはコピー初期化構文であろうと結論付けることができます:
obj s = obj("value");
そして、これが直接初期化になり構文:
obj s{"value"};
これはどうですか:
obj s = {"value"};
そして、この1:
obj s = obj{"value"};
そして、この1:
obj s("value");
またはこの1:
obj s = "value";
NOTE
ビャーネ・ストロヴストルップは、ページ311、§9.4.2に第2版、「C++を使用してプログラミング、原則と実践」彼の本の中でいくつかの初期のスタイル(すべてではない)を比較:
struct Date { int y,m,d; //year, month, day Date(int y, int m, int d); //check for valid date and initialize void add_day(int n); //increase the Date by n days };
を...
Date my_birthday; //error: my_birthday not initialized Date today{12,24,2007}; //oops! run-time error Date last{2000,12,31}; //OK (colloquial style) Date next = {2014,2,14}; //also OK (slightly verbose) Date christmas = Date{1976,12,24}; //also OK (verbose style)
氏Stroustrup氏は、同じように、これらの異なる初期のスタイルを提示します。少なくとも、それは私に見える方法です。それにもかかわらず、いくつかは直接初期化およびその他コピー初期化である可能性があります。これらの用語については、本の時点でまだ説明していないためです。
EDIT
与えられた答えは何か面白いものを持ち出します。
どうやら、これは直接初期化です:
obj s("value");
そして、これは直接リスト初期化です:あなたのいくつかが指摘するように、差がある
obj s{"value"};
。実際にどのように違うのですか?その違いは、最適化されていないコンパイラの出力で目立つでしょうか?一般に
'='はありますか?はい:コピーの初期化です。そうでない場合は直接初期化です。 – Rakete1111
@ Rakete1111 [それは本当ではないようです](http://coliru.stacked-crooked.com/a/18e4e0f6db8a9bfc)。 – nwp
@nwpもちろん、中括弧を使用すると、 '='に応じて* -list-initializationになります。ごめんなさい、ありがとう! – Rakete1111