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

一叶舟troy 发布于 2015/10/27 11:15
阅读 801
收藏 0
GCC

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

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

加载中
0
一叶舟troy
一叶舟troy

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

像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修改的常量 内容是单独存放的?汇报不懂感觉会说的很好
htfy96
htfy96
其实现在的编译器(clang3.7 gcc 5.0)你这段代码不会产生任何可执行的常量在执行文件中,也不会有什么复制操作被编译出来。常量传播模型决定了如果一个变量仅被常量赋值过,而且逻辑可以在编译时计算出来,且运算不是太复杂,那么它就会直接被在编译期计算出来。现在const 的意义主要在于1.约束操作,防止修改 2.给老版本编译器做提示用
0
_
___coder
为了运行性能考虑吧,但是不可能不占内存~
0
木兰宿莽
木兰宿莽

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的作用而不得不兼容其他用法的应用,我倒觉得不是因为减小占用内存资源而这样设计的,事实上语言是要兼顾安全性,可靠性,效率(时间的和空间的)综合的考虑的。

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

0
莫扎特的代码
莫扎特的代码
应该被编译器优化成立即数
0
周翼翼
周翼翼

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

const int i = 4;

int fun()

{

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

}


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

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

//即i有单独的内存

返回顶部
顶部