我多年来一直是C ++开发人员,不久前转而使用C#。最近我开始玩dotPeek来恢复一些旧代码。我惊讶地看到反编译器出来的代码看起来没那么优化。我开始编写一些代码,期望编译器进行表达式折叠,并对结果感到惊讶。我想分享我的观察,看看你对我为什么看到我看到的结果有什么评论。
编译器选项已优化。 .NET 4.5版。
首先,我将分享我预期的结果:
Console.Write(1 + 1 + 1); turned into Console.Write(3);
Console.Write ("a" + "b" + "c"); turned into Console.Write("abc");
现在我感到很惊讶:
string a = "aaaaa";
string b = "aaaaa";
Console.Write(b + a);
我希望编译器将此表达式折叠为:output.Write(" aaaaaaaaaa");或者至少是output.Write(a + a);它没有做到。它保留了原始。很惊讶编译器没有注意到重复的文本并引用它的单个副本两次或将常量折叠在一起。你可能会说我没有添加' const'。 (当我这样做时,编译器确实折叠了表达式并完全删除了常量)。变量是本地的,只在这一个地方使用。编译器应该已经注意到这一点,并将表达式正确地折叠在一起而没有' const'属性。
我用int进行了完全相同的实验。结果几乎相同:当我使用const int时,它正确折叠。当我删除' const'属性
int c = 1, d = 1, e = 1;
Console.Write(c + d + e);
导致:
int num1 = 1;
int num2 = 1;
int num3 = 1;
int num4 = num2;
Console.Write(num1 + num4 + num3);
这完全是巴扎尔。我无法解释这个。编译器编写了更糟糕的代码 在表达式折叠方面,C ++编译器似乎做得更好。