関数の引数に、++ した変数を連続で直接書いてしまうと、妙なコードをはいてしまう件。混合モードでアセンブラコードを見てみました。
前置きInc <>
// int n = 0; mov dword ptr [n],0 // Func(++n, ++n); mov eax,dword ptr [n] add eax,1 mov dword ptr [n],eax // + ※A mov ecx,dword ptr [n] // | add ecx,1 mov dword ptr [n],ecx mov edx,dword ptr [n] push edx mov eax,dword ptr [n] push eax call Func (411190h)
asm にゃー詳しくないのですが、dword ptr [n] を見に行くってなんか変じゃね? 'n' (==ぬるぽ) が指している先の値を見に行ってるというのが変な気が…。そもそも VC の混合モードの表示が間違ってるのかしら。
つか私にゃー "※A" のところが激しく無駄に見えて仕方ないのですが、x86じゃーこうすると高速化するんでしょうか……。^^;
…と思ったけど、最適化かかってないんだから、このコードで正解じゃん。(ぉ
前置きInc <>
// int n = 0; // Func(++n, ++n); push 2 push 2 push offset string "a = %d, b = %d\n" (4070FCh) call printf (401037h)
リテラル "2" がとても美しいですね!
…VCは、ソースファイルを超えて最適化できるので私的には評価が高いのですが、細かい部分で問題がるんだよなぁ…。 http://d.hatena.ne.jp/ir9Ex/20051029/1130535752 とかさぁー