私のコンパイラ (gcc 4.7.2) は、2 つのステートメントに対してほぼ同じコードを生成します。
_main:
LFB1018:
pushq %rbx
LCFI0:
movq __ZSt4cout@GOTPCREL(%rip), %rbx
; std::cout << foo(123) << std::endl;
movl $123, %esi
movq %rbx, %rdi
call __ZNSolsEi
movq %rax, %rdi
call __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
; std::cout << 123 << std::endl;
movq %rbx, %rdi
movl $123, %esi
call __ZNSolsEi
movq %rax, %rdi
call __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
xorl %eax, %eax
popq %rbx
LCFI1:
ret
唯一の違いは、最初の 2 つの命令の順序です。私はそれを試してみましたが、この違いは何の関係もないようですfoo()
.2行を2回繰り返すと、4つのステートメントの最後のステートメントだけが命令の順序が逆になります. これは、このアーティファクトがおそらくパイプライン オプティマイザまたはその性質に関係していると思わせます。