hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1074|回复: 9

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

[复制链接]

539

主题

539

帖子

1844

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1844
发表于 2024-2-5 19:49:23 | 显示全部楼层 |阅读模式
上周六买了本 Robert C.Seacord 著的《C安全编码标准》,就其中有一段内容与大家讨论一下。

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


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

使用道具 举报

0

主题

185

帖子

14

积分

新手上路

Rank: 1

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

使用道具 举报

0

主题

194

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-5 19:51:05 | 显示全部楼层
这个问题确实涉及到编译器的行为,所以才在论坛里提出来让大家讨论。
非常感谢 mathe 的专业回答!

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

使用道具 举报

0

主题

191

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-5 19:51:57 | 显示全部楼层
老大买的书哪年出版的啊?
有必要看看英文原著的出版时间
回复

使用道具 举报

0

主题

210

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-5 19:52:45 | 显示全部楼层
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标准。
回复

使用道具 举报

0

主题

177

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-5 19:53:34 | 显示全部楼层
如果是纯C代码,应该不会有动态创建的对象吧
回复

使用道具 举报

0

主题

185

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2024-2-5 19:53:45 | 显示全部楼层
C 里面大结构也是有可能的,且结构套结构的,非常复杂。
回复

使用道具 举报

0

主题

165

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-5 19:54:05 | 显示全部楼层
编译器应该能产生静态代码吧

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

使用道具 举报

0

主题

185

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2024-2-5 19:54:53 | 显示全部楼层
关键是“在函数体内部声明的 const 限定对象可能具有自动存储持久期”如何理解?
回复

使用道具 举报

0

主题

180

帖子

76

积分

关内侯

Rank: 2

积分
76
发表于 2024-2-5 19:55:38 | 显示全部楼层
建立在函数堆栈上?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-9 12:30 , Processed in 0.078944 second(s), 30 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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