找回密码
 欢迎注册
楼主: gxqcn

[提问] const 限定会产生额外运行开销吗?

[复制链接]
 楼主| 发表于 2009-12-24 16:31:47 | 显示全部楼层
不知编译器为何要将 const 变量这么处理?
纯粹是为了节省栈空间?还是出于其它考虑?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 16:37:34 | 显示全部楼层
关键是“在函数体内部声明的 const 限定对象可能具有自动存储持久期”如何理解?
gxqcn 发表于 2009-12-24 16:16

就是被当成全局常量处理了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-24 16:41:25 | 显示全部楼层
那后面那句怎么理解:“因此,每次调用包含这个对象的函数时,这个对象的存储空间就需要重新分配并初始化。

即便如此,与非const限定的相比,还不至于有什么额外的运行开销啊?反正我还没明白过来。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 16:45:18 | 显示全部楼层
理解错了,他这
“自动存储持久期”其实是指auto类型变量,翻译过来看着奇怪,其实就是说被当成局部变量了。所以是分配在堆栈上而不是全局内存段里面。自然每次都需要构造和析构。
不过据我所知,现在将常量当成局部变量的编译器不多。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-24 16:56:37 | 显示全部楼层
假如多个函数内部声明相同内容的常量(比如说字符串),
编译器会将它们自动合并吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 16:57:04 | 显示全部楼层
那将常量当做全局变量的也不多吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 16:59:30 | 显示全部楼层
To 15#

我觉得不会合并,因为不具有相同的语义
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 17:22:06 | 显示全部楼层
现在大部分编译器会尝试着去合并的。
当然,如果分布在不同的文件里面,必须启动Inter Procedure Analysis才会合并。
将常量申明成全局常量的缺点是有时可读性会差一些
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-25 13:38:32 | 显示全部楼层
const 限定的对象、枚举常量和类似对象的宏之间的区别
方法 求值时间 消耗内存 调试器可否看到 类型检查 编译时常量表达式
枚举 编译时
const 限定 运行时
预处理器


我估计是误理解了作者的本意:说 const 限定的对象可能会产生一些运行时开销 其相对的是,枚举常量或宏,而不是与没有用 const 限定的变量进行对比。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-25 15:26:24 | 显示全部楼层
C99 第6.7.3节提供了一个注脚:
编译器可能把 const 对象放在非 volatile 的只读存储区域中。而且,如果这种对象的地址永远不使用,编译器可以不必为它分配空间。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-29 01:25 , Processed in 0.056841 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表