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



阅读Meyers的书(条目2 "Prefer const to #define "),我想理解下面列出的一些句子:

  1. 关于#define ASPECT_RATIO 1.653const aspect_ratio = 1.653的比较,Meyers提出"…在浮点常数的情况下(例如在这个例子中),使用该常数可能比使用#define产生更小的代码。问题是:更小的代码Meyers意味着磁盘上可执行文件的空间更小?为什么它更小?我认为这可能在32位的系统上有效,因为在这种情况下,int(或指针)需要4字节和双8字节。因为ASPECT_RATIO可能不会进入符号表,所以名称被替换为值,而在其他情况下,可以使用const指针指向唯一的双精度值。在这种情况下,这个概念在64位的机器上不再有效(因为指针和双精度是相同的字节数)。我不知道我是否解释得很好,尤其是这个想法是否正确?

  2. 然后Meyers问"…虽然好的编译器不会为整型的const对象留出存储空间(除非你创建一个指向该对象的指针或引用),但粗糙的编译器可能会这样做,而且你可能不愿意为这样的对象留出内存……"在这种情况下,内存是由正在执行的进程占用的RAM ?如果验证这一点是正确的,我可以使用任务管理器(在Win)或top(在Linux)?

首先,微优化是愚蠢的。不要担心几个常量双精度值会占用你所有的内存。这不会发生的。如果有,那就处理,而不是在你知道它是相关的之前。

第二,如果使用太多#define可能会有严重的副作用,即使使用ALL_CAPS_DEFINES惯例。您迟早会错误地创建一个用于其他变量名称的短宏,而预处理器替换会给您带来无法理解且可避免的错误,并且根本无法调试。正如问题注释中链接的问题所述,宏缺乏命名空间和类作用域,在c++中绝对是糟糕的。

第三,c++ 11增加了constexpr,它允许类型安全的宏性能常量表达式(不管这个用词不当意味着什么)。甚至还有一些(参见SO Chat中的c++ Lounge)在编译时使用constexpr进行整个计算。不幸的是,并不是所有声称支持c++ 11的主要编译器,实际上都支持足够多的c++ 11特性来真正有用(我在看你,MSVC2012!)。

  1. 它"可能"产生更小的代码的原因是,多次使用一个定义可能(可能:优化器做奇怪的事情)也会一次又一次地生成相同的常量。而使用const只会生成一个定义,然后引用同一个定义(如果优化器没有内联计算内容)。
  2. 链接器在链接可执行文件时输出几个部分。有些部分包含常量,有些部分包含可执行代码。无论你的(操作)系统是否在执行之前将可执行文件加载到ram中,c++标准中没有定义。我使用的系统中代码从闪存执行,所以只有堆栈和动态分配的内存使用ram。

最新更新