gxqcn 发表于 2009-12-24 09:33:44

const 限定会产生额外运行开销吗?

上周六买了本 Robert C.Seacord 著的《C安全编码标准》,就其中有一段内容与大家讨论一下。

const 限定的对象可能会产生一些运行时开销。
例如,大多数编译器为 const 限定的对象分配内存。在函数体内部声明的 const 限定对象可能具有自动存储持久期。如果是这样,编译器就在堆栈上为这种对象分配空间。因此,每次调用包含这个对象的函数时,这个对象的存储空间就需要重新分配并初始化。

以前我对 const 的认识,主要集中在让编译器执行类型检查。请大家来说说对上面这段文字的理解。

mathe 发表于 2009-12-24 09:56:10

这个我觉得很是同编译器有关系。好一点的编译器肯定会尽量不给const对象分配地址。
通常情况下使用const是有利于编译器优化,因为提供给编译器更多信息。
此外,对于复杂的const对象通常需要分配内存。对于编译器来说,简单常量是没有必要为它分配内存的,直接嵌入代码就可以了,但是如果是复杂的常量对象,那么还是需要分配内存的。所以这种情况,如果声明为const,那么通常编译器会放在一个专用的全局常量段。而如果不声明const,那么对应的变量将会在堆栈里面。这时哪种好就很难说了。堆栈里面每次都要调用构造析构函数,但是使用的内存通常已经在cache里面。

gxqcn 发表于 2009-12-24 10:09:05

这个问题确实涉及到编译器的行为,所以才在论坛里提出来让大家讨论。
非常感谢 mathe 的专业回答!

在C语言里,对象一般不会太大,除非是通过函数返回的复杂对象。
所以还是有必要尽量加const限定。

无心人 发表于 2009-12-24 14:15:00

老大买的书哪年出版的啊?
有必要看看英文原著的出版时间

gxqcn 发表于 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代码,应该不会有动态创建的对象吧

gxqcn 发表于 2009-12-24 16:09:15

C 里面大结构也是有可能的,且结构套结构的,非常复杂。

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

编译器应该能产生静态代码吧

因为结构本质上有通过地址计算直接获取数据的方式

gxqcn 发表于 2009-12-24 16:16:51

关键是“在函数体内部声明的 const 限定对象可能具有自动存储持久期”如何理解?

无心人 发表于 2009-12-24 16:22:00

建立在函数堆栈上?
页: [1] 2
查看完整版本: const 限定会产生额外运行开销吗?