运行代码
#include<iostream>
using namespace std;
static void prindAddress(int a, int b, int c){
cout<<"a"<< a <<" "<<&a<<endl;
cout<<"b"<< b <<endl;
cout<<"c"<< c <<" "<< &c << endl;
}
int main(int argc, char** argv){
prindAddress(1,2,3);
return 0;
}
release版本输出结果:
debug版本输出结果:
仔细观察,可以发现release版本的结果中,a与c的值差为4,debug版本的结果中,a和c的结果直差为8.为什么?
原因:
四个字节被优化掉了。
32位系统——调用函数是通过栈来传递参数,我们打印的地址实际上是在栈里面位置的地址
64位系统——函数传参绝大多数不同通过栈来传输的,而是通过寄存器。默认情况下,前六个参数都可以通过寄存器来进行传输,这就减少了栈的使用。64位操作系统速度快,不仅仅是因为内存寻址变大了,可使用的寄存器的数目也变大了。
打印b的时候,我们只是打印了b的值,所以只是通过寄存器,没有通过内部的栈,因此系统只给a和c的地址预留好栈,所以地址只差会发生改变。
Debug版本主要是方便调试。Debug版本的代码没有经过优化,有问题可以比较准确的定位到哪个文件,哪一行附近。但debug版本没进过优化,所以一般生成的文件比较大,运行效率比较慢, 在一些大的系统中甚至要慢一个数量级以上。