変数が返されると、段階的に何が起こるか。組み込みで適合する場合、rax/eax/ax にスローされることはわかっています。適合しない場合、および/または組み込みでない場合はどうなりますか? さらに重要なことは、コピー コンストラクターの呼び出しが保証されているかどうかです。
編集:デストラクタはどうですか?それは「時々」、「常に」、または「決して」と呼ばれますか?
変数が返されると、段階的に何が起こるか。組み込みで適合する場合、rax/eax/ax にスローされることはわかっています。適合しない場合、および/または組み込みでない場合はどうなりますか? さらに重要なことは、コピー コンストラクターの呼び出しが保証されているかどうかです。
編集:デストラクタはどうですか?それは「時々」、「常に」、または「決して」と呼ばれますか?
戻り値が格納される場所は、呼び出し規約に完全に依存し、アーキテクチャとシステムに非常に固有です。
コンパイラは、コピー コンストラクタの呼び出しを省略できます (つまり、コピー コンストラクタを呼び出す必要はありません)。関数から値を返すと、関数の戻り値で何が行われているかに応じて、代入演算子も呼び出されることに注意してください。
関数/メソッドの戻り型が参照である場合、事実上コピーは行われません。非参照リターンタイプの場合、プラットフォームの呼び出し規約によってはコピーが行われる場合があります。
レジスタリッチ(通常はRISC)アーキテクチャでは、適度に大きなリターン構造を保持するためにレジスタが十分に割り当てられている場合があります。これは、キャッシュ/レジスタトランザクションと比較してコストがかかる過剰なメモリトランザクションを回避するためです。
あなたの質問があなたが言及するレジスタによって暗示するx86-descendedIntelファミリでは、RISCよりもコピーコンストラクタを呼び出す可能性が高くなります。