C++-C++中const内存分配

C++-C++中const内存分配

夜无邪 发布于 2017-02-18 字数 598 浏览 1334 回复 6

在看《C++编程思想》有关const部分的时候,书中提到When you use extern with const, however, you force storage to be allocated (this is also true for certain other cases, such as taking the address of a const)
出于好奇,我想验证下这句话,于是写了这样一个测试程序:

#include <iostream>
using namespace std;

extern const int ext_c = 1000;
const int internal_c = 1001;

int main()
{
const int i = 10;
const int j = i + 100;
long addr = (long)&j;

return 0;
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

偏爱自由 2017-10-23 6 楼

C++编译器一般部位const变量分配内存,而是将其保存在符号表中,这是为了提高效率。但是有些情况下,编译器还是会为const变量分配内存的,比如取地址或者是用做extern。

看下面一段例子代码:

 #define PI 3.14159 file://常量宏
const doulbe Pi=3.14159; file://此时并未将Pi放入ROM中
......
double i=Pi; file://此时为Pi分配内存,以后不再分配!
double I=PI; file://编译期间进行宏替换,分配内存
double j=Pi; file://没有内存分配
double J=PI; file://再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

你的代码中应该因为这句代码:

 const int j = i + 100;

导致编译器为i变量分配了内存空间。

参考资料:
C++ const详解

虐人心 2017-10-02 5 楼

在int main()
{
static const int sc_i = 100;
long add_i = (long)&sc_i;
}
Debug模式下禁用优化,查看汇编代码:
CONST SEGMENT
?ext_c@@3HB DD 03e8H ; ext_c
?sc_i@?1??main@@9@4HB DD 064H ; main'::2'::sc_i
CONST ENDS
在函数中的static const也会放到全局CONST段中。

结合前面的分析(不考虑编译器优化情况),可以总结如下:
1.全局的const和static const若被引用,编译器是要分配内存地址的,并将这些变量分配到CONST段中;若没有被引用,那它将被编译器给folded掉。
2.函数内定义的const(非static const)都会在栈上开辟一个内存空间,不论这个const是否被引用

泛泛之交 2017-09-17 4 楼

学习了,楼下的各位,原来是编译器反汇编的问题

想挽留 2017-06-27 3 楼

const定义的常量在程序运行过程中只有一份拷贝,任何时候访问它返回的不是立即数,而是它的地址。

偏爱自由 2017-03-30 2 楼

你这应该是在DEBUG模式下面的反汇编,这是编译器生成汇编代码是为了能更好的调试,所以还是会分配地址给const常量,如果你打开编译器的O2优化选项的话,就不会分配地址了

夜无邪 2017-03-08 1 楼

编译器是可以不给i分配地址,而不是必须不分配地址。你打开编译器优化,/O2选项,再查看汇编结果就不同了。