找回密码
 欢迎注册
查看: 26690|回复: 19

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

[复制链接]
发表于 2009-12-24 09:33:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
上周六买了本 Robert C.Seacord 著的《C安全编码标准》,就其中有一段内容与大家讨论一下。 const 限定的对象可能会产生一些运行时开销。 例如,大多数编译器为 const 限定的对象分配内存。在函数体内部声明的 const 限定对象可能具有自动存储持久期。如果是这样,编译器就在堆栈上为这种对象分配空间。因此,每次调用包含这个对象的函数时,这个对象的存储空间就需要重新分配并初始化。 以前我对 const 的认识,主要集中在让编译器执行类型检查。请大家来说说对上面这段文字的理解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 09:56:10 | 显示全部楼层
这个我觉得很是同编译器有关系。好一点的编译器肯定会尽量不给const对象分配地址。 通常情况下使用const是有利于编译器优化,因为提供给编译器更多信息。 此外,对于复杂的const对象通常需要分配内存。对于编译器来说,简单常量是没有必要为它分配内存的,直接嵌入代码就可以了,但是如果是复杂的常量对象,那么还是需要分配内存的。所以这种情况,如果声明为const,那么通常编译器会放在一个专用的全局常量段。而如果不声明const,那么对应的变量将会在堆栈里面。这时哪种好就很难说了。堆栈里面每次都要调用构造析构函数,但是使用的内存通常已经在cache里面。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-24 10:09:05 | 显示全部楼层
这个问题确实涉及到编译器的行为,所以才在论坛里提出来让大家讨论。 非常感谢 mathe 的专业回答! 在C语言里,对象一般不会太大,除非是通过函数返回的复杂对象。 所以还是有必要尽量加const限定。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 14:15:00 | 显示全部楼层
老大买的书哪年出版的啊? 有必要看看英文原著的出版时间
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-24 14:52:43 | 显示全部楼层
C 安全编码标准/(美) 塞克德 (Seacord, R. C.) 著;徐波等译。——北京:机械工业出版社,2010.1 书名原文:The Cert C Secure Coding Standard ISBN 978-7-111-28442-0 现在还是2009年吧?这本书是我上周去新华书店买的,标注的居然是:2010年1月第1版第1次印刷。 上面“早产”现象我当时也注意到了,看在内容还比较有借鉴性和参考性的份上就买下了(因为老婆有几张购书券元旦前要到期了)。 原版至少是2008年6月以后的,内容涉及C89/C99标准。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 15:55:33 | 显示全部楼层
如果是纯C代码,应该不会有动态创建的对象吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-24 16:09:15 | 显示全部楼层
C 里面大结构也是有可能的,且结构套结构的,非常复杂。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 16:10:59 | 显示全部楼层
编译器应该能产生静态代码吧 因为结构本质上有通过地址计算直接获取数据的方式
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-12-24 16:16:51 | 显示全部楼层
关键是“在函数体内部声明的 const 限定对象可能具有自动存储持久期”如何理解?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-12-24 16:22:00 | 显示全部楼层
建立在函数堆栈上?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-21 17:53 , Processed in 0.029108 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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