gxqcn 发表于 2009-12-24 16:31:47

不知编译器为何要将 const 变量这么处理?
纯粹是为了节省栈空间?还是出于其它考虑?

mathe 发表于 2009-12-24 16:37:34

关键是“在函数体内部声明的 const 限定对象可能具有自动存储持久期”如何理解?
gxqcn 发表于 2009-12-24 16:16 http://bbs.emath.ac.cn/images/common/back.gif
就是被当成全局常量处理了

gxqcn 发表于 2009-12-24 16:41:25

那后面那句怎么理解:“因此,每次调用包含这个对象的函数时,这个对象的存储空间就需要重新分配并初始化。”

即便如此,与非const限定的相比,还不至于有什么额外的运行开销啊?反正我还没明白过来。

mathe 发表于 2009-12-24 16:45:18

理解错了,他这
“自动存储持久期”其实是指auto类型变量,翻译过来看着奇怪,其实就是说被当成局部变量了。所以是分配在堆栈上而不是全局内存段里面。自然每次都需要构造和析构。
不过据我所知,现在将常量当成局部变量的编译器不多。

gxqcn 发表于 2009-12-24 16:56:37

假如多个函数内部声明相同内容的常量(比如说字符串),
编译器会将它们自动合并吗?

无心人 发表于 2009-12-24 16:57:04

那将常量当做全局变量的也不多吧

无心人 发表于 2009-12-24 16:59:30

To 15#

我觉得不会合并,因为不具有相同的语义

mathe 发表于 2009-12-24 17:22:06

现在大部分编译器会尝试着去合并的。
当然,如果分布在不同的文件里面,必须启动Inter Procedure Analysis才会合并。
将常量申明成全局常量的缺点是有时可读性会差一些

gxqcn 发表于 2009-12-25 13:38:32

const 限定的对象、枚举常量和类似对象的宏之间的区别 方法 求值时间 消耗内存 调试器可否看到 类型检查 编译时常量表达式 枚举 编译时 否 是 是 是 const 限定 运行时 是 是 是 否 宏 预处理器 否 否 否 是

我估计是误理解了作者的本意:说 const 限定的对象可能会产生一些运行时开销 其相对的是,枚举常量或宏,而不是与没有用 const 限定的变量进行对比。

gxqcn 发表于 2009-12-25 15:26:24

C99 第6.7.3节提供了一个注脚:
编译器可能把 const 对象放在非 volatile 的只读存储区域中。而且,如果这种对象的地址永远不使用,编译器可以不必为它分配空间。
页: 1 [2]
查看完整版本: const 限定会产生额外运行开销吗?