5
回答
C++的编译器通常不为普通const常量分配存储空间

C++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,同时,这也是它取代预定义语句的重要基础

 如何理解 const不占用内存吗?

GCC
举报
一叶舟troy
发帖于3年前 5回/761阅
共有5个答案 最后回答: 3年前

引用来自“周翼翼”的评论

像int ,char这些基础类型, 直接放到指令里,即在指令内存里. 其它的应当在数据段里.

const int i = 4;

int fun()

{

 int j = i; // 编译成一指令movl    $4, 12(%esp)

}


//如果不是const ,编译成:

    movl    _i, %eax
    movl    %eax, 12(%esp)

//即i有单独的内存

const修改的常量 内容是单独存放的?汇报不懂感觉会说的很好
--- 共有 1 条评论 ---
htfy96其实现在的编译器(clang3.7 gcc 5.0)你这段代码不会产生任何可执行的常量在执行文件中,也不会有什么复制操作被编译出来。常量传播模型决定了如果一个变量仅被常量赋值过,而且逻辑可以在编译时计算出来,且运算不是太复杂,那么它就会直接被在编译期计算出来。现在const 的意义主要在于1.约束操作,防止修改 2.给老版本编译器做提示用 3年前 回复

C++的const在你所说的情况下类似与C的#define,不同的是const所声明的变量会进行类型检查,比如#define A   20不会去检查A是不是整型量而只是纯粹的进行文本替换,C++为了弥补这一点就将const来替代#define的预编译,应该说C也有const并且会为变量分配内存,在C中const int a=10;意味着会为a分配4个字节,里面的值为10;但a只是个只读量而不能称之为常量或字面量;相反在C++中const int a=10;是不会为a分配内存的,而只是定义了a是个值为10的常量;当然C++中const的作用远比这里所说的大。

综上,C++中的const不占用(事实上特殊情况下是会要占用的)一方面是出于的C中#define不做类型检查而导致的安全性问题的考虑,另一方面是C++放大了const的作用而不得不兼容其他用法的应用,我倒觉得不是因为减小占用内存资源而这样设计的,事实上语言是要兼顾安全性,可靠性,效率(时间的和空间的)综合的考虑的。

另外,这真的不是我们要斤斤计较的地方!

像int ,char这些基础类型, 直接放到指令里,即在指令内存里. 其它的应当在数据段里.

const int i = 4;

int fun()

{

 int j = i; // 编译成一指令movl    $4, 12(%esp)

}


//如果不是const ,编译成:

    movl    _i, %eax
    movl    %eax, 12(%esp)

//即i有单独的内存

顶部