起因:
代码:
#include <iostream>
using namespace std;
int main()
{
int a = 0;
a = a++;
cout << a << endl;
return 0;
}
通过minGW算得结果,是原a的值(尝试了几个不同的优化等级)
有关gcc优化等级:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options
查看反汇编
使用 g++ -S test.s test.cpp
生成汇编代码。(test.cpp为目标文件源码,test.s为预生成的汇编代码文件)。注:此方式生成的汇编与源文件无关联,不易阅读。
使用 objdump -S tt.exe
生成汇编文件。此方式生成汇编文件与源文件具有关联关系,便于阅读。(注意这里的tt.exe需要可调式模式下生成的)
或者使用这个在线反汇编的网站:https://gcc.godbolt.org/z/bEzbMvTbW
msvc生成的是加一后版本
- msvc编译工具:
- cl.exe:编译程序
- link.exe:链接程序
- lib.exe:加载lib库的程序
- nmake.exe:用Makefile进行构建、编译的工具
使用 cl -help
查看cl参数:
编译结果:
使用vs编译:
查看反汇编:
未定义的行为
其实在一开始编译器就给出警告 warning: operation on 'a' may be undefined
,这是语言标准未定义的行为。
因此,最终输出的结果和编译器有关,也和编译器的优化等级有关。时间关系我没有测优化等级的影响,但就未定义的行为本身,因为无法确定其结果,因此我们只能从汇编上理解各编译器是怎么操作的。
C++Primer上也讲到:不要依赖未定义行为