1

クラス外のオブジェクトを初期化するために、CPPファイルにこのようなものがあります。私はそれを単純化しましたが、要点は複雑な初期化が行われているということですが、単一のインスタンスを作成したいのです:

static MyBigObject o = []()
{
  MyBigObject ret;
  ret.Init();
  return ret; 
}();

私の質問は、コンパイラの巧妙さのために、このオブジェクトがコピーさretれたり、インプレースで作成されたりすることですか? o「その場で作成された」という適切な用語があるかもしれません-定置?

適切であれば、私は C++17 で作業しています (つまり、答えは言語のバージョンによって異なります)。明確な答えはありますか、それともコンパイラ固有の最適化でしょうか?

4

1 に答える 1

2

この場合: これはコンパイラによって異なります。これは戻り値の最適化と呼ばれ、省略可能です。C++17 では、オブジェクトのコピー/移動コンストラクタ (およびそのデストラクタ) に目に見える副作用がある場合でも、コピーを省略できますが、必須ではありません。

于 2021-03-01T13:14:07.143 に答える