debug版本和release版本

简介: 运行代码#includeusing namespace std;static void prindAddress(int a, int b, int c){ cout

运行代码

#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版本没进过优化,所以一般生成的文件比较大,运行效率比较慢, 在一些大的系统中甚至要慢一个数量级以上。

来源:https://bbs.csdn.net/topics/391991962?page=1

相关文章
|
存储 Cloud Native Linux
QtCreator中三种不同编译版本 debug、release、profile 的区别
QtCreator中三种不同编译版本 debug、release、profile 的区别
|
7月前
|
算法 编译器 程序员
深入理解C++编译模式:了解Debug和Release的区别
深入理解C++编译模式:了解Debug和Release的区别
1267 3
|
Windows
CMake 如何设置 Debug 和 Release 下的不同配置
CMake 设置 Debug 和 Release 下不同的工程依赖库,编译选项宏隔离等
876 1
CMake 如何设置 Debug 和 Release 下的不同配置
|
存储 缓存 运维
2023-5-19-Debug和Release到底有多少不同?
2023-5-19-Debug和Release到底有多少不同?
328 0
|
iOS开发 MacOS
macOS更新系统后 brew 安装报错不支持pre-release version
macOS更新系统后 brew 安装报错不支持pre-release version
371 0
linux下debug与release编译的方法
linux下debug与release编译的方法
|
安全 Java 开发工具
Android签名详解(debug和release)
Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换 2) 保证信息传输的完整性 签名对于包中的每个文件进行处理,以此确保包中内容不被替换 3) 防止交易中的抵赖发生,Market对软件的要求 2.
1862 0
|
编译器 C++ Windows
VS2010编译生成lib库Release版本比Debug版本大的原因
最近在visual studio2010和2019生成Windows的lib库的时候发现Release版本的lib比Debug版本要大
214 0
VS2010编译生成lib库Release版本比Debug版本大的原因
RELEASE版本的RegisterClass()失败
RELEASE版本的RegisterClass()失败
87 0
|
存储 Java 编译器
Cromwell release-49 新特性解析
近期发布的 Cromwell release-49 版本发布了 Task 级别 Callcaching 开关和中间数据删除两个比较有用的新特性,下面对这些特性做个解析。
892 1

热门文章

最新文章