编译器:Visual C ++ 2012 RTM
对我而言,将内联调用test()到第二个std :: cout语句中似乎很奇怪。
答案 0 :(得分:8)
是。编译器可以自由地进行程序无法检测的更改。由于test
函数没有外部可见效果,因此编译器可以根据需要提前或延迟使用它,甚至可以完全消除它。
如果您可以通过某种方式解释这种优化使您的代码做了一些不应该做的事情,那么您就有了一些东西。但到目前为止,您唯一的主张是它使您的代码运行得更慢或更快。编译器可以自由地进行优化,使代码的某些部分变慢,某些部分更快。事实上,这是优化的本质 - 我们希望通过性能权衡来产生净收益。这可能会导致生成质量差的代码,尽管在这种情况下它似乎没有,但它肯定是有效的。这就是优化的全部意义。
编译器获取源代码并生成输出编译代码。可以自由构建它喜欢的任何编译代码,只要它产生源代码要求它生成的可观察结果即可。如果它能够找到一种以其认为更好的方式产生相同效果的方法,则不需要以与源代码相同的方式生成输出。这是优化的全部要点 - 不要按字面意思做你要求它做的事情,而是要产生相同的结果,其他的,希望更好的方式。