1
コンパイル時に式の重複項が削除されました。コンパイル時に式から重複項が削除されました
は、私が持っているし、次の行
a = b/1;
a = b * 1;
a = b + 0;
a = b - 0;
a = b << 0;
a = b >> 0;
の言うコンパイラは実際にそれがない単にa = b;
コンパイル時に式の重複項が削除されました。コンパイル時に式から重複項が削除されました
は、私が持っているし、次の行
a = b/1;
a = b * 1;
a = b + 0;
a = b - 0;
a = b << 0;
a = b >> 0;
の言うコンパイラは実際にそれがない単にa = b;
にこれらを最適化します。あなたはDebug
- >Windows
- >Disassembly
のVisual Studioで逆アセンブラを開くことができます。私はこれを書いた:
int a, b;
a = Convert.ToInt32(Console.ReadLine());
b = a/1;
b = a * 1;
b = a + 0;
b = a - 0;
b = a << 0;
b = a >> 0;
Console.WriteLine("{0}", b);
そして最適化をデバッグビルドで有効にした。
000007FE974040F4 E8 F7 62 D1 5E call 000007FEF611A3F0
000007FE974040F9 89 45 E4 mov dword ptr [rbp-1Ch],eax
000007FE974040FC 8B 4D E4 mov ecx,dword ptr [rbp-1Ch]
000007FE974040FF 89 4D EC mov dword ptr [rbp-14h],ecx
b = a/1;
000007FE974242C2 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242C5 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a * 1;
000007FE974242C8 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242CB 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a + 0;
000007FE974242CE 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242D1 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a - 0;
000007FE974242D4 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242D7 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a << 0;
000007FE974242DA 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242DD 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a >> 0;
000007FE974242E0 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242E3 89 4D E8 mov dword ptr [rbp-18h],ecx
あなたはそれだけでa
b
に6回のコピーだ、アセンブリ命令は、各ラインの正確な同じです見ることができます:解体では、私はこれを得ました。実際には、それは単一のb=a
命令に全体を最適化していないことに驚いています。私はConsole.WriteLine
をコメントアウトした場合それはありません:
000007FE974041D4 E8 17 62 D1 5E call 000007FEF611A3F0
000007FE974041D9 89 45 E8 mov dword ptr [rbp-18h],eax
000007FE974041DC 8B 45 E8 mov eax,dword ptr [rbp-18h]
000007FE974041DF 89 45 EC mov dword ptr [rbp-14h],eax
b = a/1;
000007FE974041E2 90 nop
b = a * 1;
b = a + 0;
b = a - 0;
b = a << 0;
b = a >> 0;
// Console.WriteLine("{0}", b);
}
000007FE974041E3 90 nop
私は驚いて場合ことで、それが使用されることはありませんので、それは、完全にb
を最適化しませんが。多分誰かがそれを説明することができます。
答えは、OPが「JITされたコードの最後から冗長な割り当てを取り除いてもよいか」という質問には興味がありません。正確な質問に答えると、ASMではなくILが表示されます。 –
ツールを指摘してくれてありがとうございました。 – Hugoagogo
ようこそ。 2番目のコードをもう一度見てみると、実際には 'b'を最適化していることがわかります。最初の3つの' mov'命令は 'Convert.Int32()'の結果を 'a'にコピーしています。しかし、あなたは 'a'も最適化し、関数呼び出しの結果を無視すると思うでしょう。しかたがない。 – smead