値がリテラルであるかどうかに違いはありません(関数がインライン化されていて、コンパイラーがいくつかのものを最適化できる場合を除く)。
通常、パラメーターはレジスターまたは関数パラメーター・スタックに入れられます。それらが明示的な値であるか変数であるかに関係なく。
最適化を行わないと、パラメーターはパラメータースタックにプッシュされます。最初のケースでは、の値がx
最初に取得されてレジスタに入れられeax
、次にパラメータスタックにプッシュされます。foo
印刷しx
ます。
foo(x);
00361A75 mov eax,dword ptr [x]
00361A78 push eax
00361A79 call get_4 (3612B7h)
00361A7E add esp,4
foo(3);
00361A81 push 3
00361A83 call get_4 (3612B7h)
00361A88 add esp,4
最適化を使用すると、関数はコンパイラーに表示され(私のサンプルでは)、呼び出しは完全にスキップされます。
foo(x);
01011000 mov ecx,dword ptr [__imp_std::cout (101203Ch)]
01011006 push 3
01011008 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (1012038h)]
foo(3);
0101100E mov ecx,dword ptr [__imp_std::cout (101203Ch)]
01011014 push 3
01011016 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (1012038h)]
foo
と定義されている:
void foo(int x)
{
std::cout << x;
}