首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清单常量与C++关键字"const“

清单常量与C++关键字"const“
EN

Stack Overflow用户
提问于 2013-01-03 14:08:41
回答 2查看 4.4K关注 0票数 10

阅读“梅耶斯之书”(第2项“更喜欢康斯特而不是#定义”),我想理解以下几句话:

  1. 关于#define ASPECT_RATIO 1.653const aspect_ratio = 1.653之间的比较,Meyers要求“.在浮点常量的情况下(例如在本例中),使用常量可能会产生比使用#define更小的代码。”问题是:使用较小的代码,Meyers意味着磁盘上可执行文件的空间更小?为什么它会变小?我认为这在32位的系统上是有效的,因为在本例中,int (或指针)需要4字节和双8字节。因为ASPECT_RATIO可能不会被输入符号表,所以名称被替换为该值,而在其他情况下,可以使用指向唯一双值的const指针。在这种情况下,这个概念在64位的机器上不再有效(因为指针和双字节是相同的字节数)。我不知道我是否很好地解释了我的意思,尤其是这个想法是否正确?
  2. 然后迈尔斯要求“...though好编译器不会为集成类型的const对象留出存储空间(除非您创建一个指针或对对象的引用),草率编译器可能不愿意为这些对象留出内存……”在这种情况下,内存是否被正在执行的进程占用?如果验证是正确的,我可以使用任务管理器(在Win)或top (在Linux中)?
EN

回答 2

Stack Overflow用户

发布于 2013-01-03 14:21:59

首先,微观优化是愚蠢的。不要在意两个恒定的双值消耗了你所有的内存。这不会发生的。如果是这样的话,那就处理它,而不是在你知道它是相关的之前。

第二,如果使用太多,#define可能会产生严重的副作用,即使在ALL_CAPS_DEFINES惯例中也是如此。迟早,您会错误地生成一个用于其他变量名称中的短宏,而预处理器的替换会给您带来一个无法理解和可以避免的错误,并且根本无法调试。正如问题注释中的链接问题一样,宏缺少名称空间和类范围,在C++中肯定是不好的。

第三,C++11添加了constexpr,它允许类型化宏执行(不管这个错误的名称意味着什么)常量表达式。甚至还有那些在编译时使用C++进行计算的人(参见SO中的C++酒廊)。不幸的是,并非所有声称支持C++11的主要编译器实际上都支持足够的C++11特性,使其真正有用(我正在查看您,MSVC2012!)。

票数 7
EN

Stack Overflow用户

发布于 2013-01-03 14:57:37

  1. 它“可能”产生较小代码的原因是定义的多个用途可能(可能:优化器会做一些奇怪的事情)也会一次又一次地生成相同的常量。而使用const只会生成一个定义,然后引用相同的定义(如果优化器不进行内联计算)。
  2. 链接器在链接可执行文件时输出几个部分。某些部分包含常量,另一部分包含可执行代码。在执行之前,您的(操作系统)系统是否将可执行文件加载到ram中,这不是在C++标准中定义的。我使用了从闪存执行代码的系统,因此只有堆栈和动态分配的内存使用ram。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14140506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档