0

编译器:Visual C++ 2012 RTM

错误与否?:https ://connect.microsoft.com/VisualStudio/feedback/details/763601/visual-c-2012-rtm-serious-compiler-bug

对我来说,它将调用 test() 内联到第二个 std::cout 语句中似乎很奇怪。

4

2 回答 2

8

是的。编译器可以自由地进行程序无法检测到的更改。由于该test函数没有外部可见的影响,因此编译器可以根据自己的意愿自由地使其尽早或延迟,甚至完全消除它。

如果您能以某种方式解释这种优化使您的代码做一些不应该做的事情,那么您就有了一些东西。但到目前为止,您唯一的说法是它使您的代码运行得更慢或更快。编译器可以自由地进行优化,使代码的某些部分变慢而某些部分变快。事实上,这就是优化的本质——做出我们希望能产生净收益的性能权衡。这可能会导致生成的代码质量很差,尽管在这种情况下似乎没有,但它肯定是有效的。这就是优化的全部内容。

编译器获取您的源代码并生成输出编译代码。只要它产生您的源代码要求它产生的可观察结果,它就可以免费构建它喜欢的任何编译代码。如果它可以找到一种方法以它认为更好的方式产生相同的效果,则不需要以与源代码相同的方式产生输出。这就是优化的全部意义——不要按字面意思做你要求它做的事情,而是以其他方式产生相同的结果,希望是更好的方式。

于 2012-09-20T09:10:33.480 回答
3

它归结为as-if规则。编译器可以自由地以任何它认为合适的方式转换程序,只要它的外部行为与转换之前的行为没有区别。

可以在此处找到更精确的规则表述。请注意,对 volatile 的访问包含在此定义中,因此您在更改波动性时会看到差异。

于 2012-09-20T09:19:54.207 回答