例如,当没有左值时,我无法想象编译器会做什么,例如: number>>1;我的直觉告诉我,由于优化,编译器将从编译中丢弃这一行,如果删除优化,会发生什么?它是否使用寄存器来执行操作?或者它的行为类似于函数调用,因此参数被传递到堆栈,然后使用的内存被标记为已释放?或者它会将其转换为NOP操作吗?我可以使用VS++调试器查看发生了什么吗?谢谢你的帮助。
发布于 2013-03-09 07:35:53
在您给出的示例中,它将丢弃该操作。它知道操作没有副作用,因此不需要发出代码来执行语句来生成正确的程序。如果禁用优化,编译器仍可能发出代码。如果启用优化,编译器可能仍然会发出代码--这并不完美。
您可以使用微软编译器的/FAsc命令行选项查看编译器发出的代码。该选项创建了一个清单文件,其中包含编译器的目标代码输出以及相关的源代码。
还可以在调试器中使用“查看反汇编”来查看编译器生成的代码。
在优化代码上使用"view disassembly“或/FAsc,我希望编译器不会发出任何代码。
发布于 2013-03-09 09:49:25
假设number是一个整数类型的常规变量(不是volatile),那么任何有能力的优化编译器(微软、英特尔、GNU、IBM等)都不会产生任何结果。不是nop,没有使用寄存器,等等。
如果禁用了优化(在"debug build“中),那么编译器很可能会”按您的要求做“,因为它没有意识到代码没有副作用。在这种情况下,值将被加载到寄存器中,向右移位一次。此操作的结果不会存储在任何地方。编译器将执行“无用的代码消除”作为优化步骤之一-我不确定是哪一个步骤,但对于这种相对简单的事情,我希望编译器能用相当基本的优化设置找出答案。在某些情况下,在涉及循环等情况下,编译器可能不会优化代码,直到启用了一些更高级的优化设置。
正如注释中提到的,如果变量是易失性的,则由于编译器必须读取volatile内存,因此必须读取number表示的内存。
在Visual studio中,如果您“查看反汇编”,它应该显示编译器生成的代码。
最后,如果这是C++,也有可能变量不是常规整数类型,当编译器看到此代码时,函数operator>>将被调用-此函数除了返回结果外,还可能有副作用,因此很可能必须执行。但在C中不可能是这种情况,因为没有操作符重载。
https://stackoverflow.com/questions/15305096
复制相似问题