纯粹是为了节省栈空间?还是出于其它考虑? 关键是“在函数体内部声明的 const 限定对象可能具有自动存储持久期”如何理解?
gxqcn 发表于 2009-12-24 16:16 http://bbs.emath.ac.cn/images/common/back.gif
就是被当成全局常量处理了 那后面那句怎么理解:“因此,每次调用包含这个对象的函数时,这个对象的存储空间就需要重新分配并初始化。”
即便如此,与非const限定的相比,还不至于有什么额外的运行开销啊?反正我还没明白过来。 理解错了,他这
“自动存储持久期”其实是指auto类型变量,翻译过来看着奇怪,其实就是说被当成局部变量了。所以是分配在堆栈上而不是全局内存段里面。自然每次都需要构造和析构。
不过据我所知,现在将常量当成局部变量的编译器不多。 假如多个函数内部声明相同内容的常量(比如说字符串),
编译器会将它们自动合并吗? 那将常量当做全局变量的也不多吧 To 15#
我觉得不会合并,因为不具有相同的语义 现在大部分编译器会尝试着去合并的。
当然,如果分布在不同的文件里面,必须启动Inter Procedure Analysis才会合并。
将常量申明成全局常量的缺点是有时可读性会差一些 const 限定的对象、枚举常量和类似对象的宏之间的区别 方法 求值时间 消耗内存 调试器可否看到 类型检查 编译时常量表达式 枚举 编译时 否 是 是 是 const 限定 运行时 是 是 是 否 宏 预处理器 否 否 否 是
我估计是误理解了作者的本意:说 const 限定的对象可能会产生一些运行时开销 其相对的是,枚举常量或宏,而不是与没有用 const 限定的变量进行对比。 C99 第6.7.3节提供了一个注脚:
编译器可能把 const 对象放在非 volatile 的只读存储区域中。而且,如果这种对象的地址永远不使用,编译器可以不必为它分配空间。
页:
1
[2]