清单常量与C++关键字"const"
manifest constants vs C++ keyword "const"
阅读Meyers的书(条目2 "Prefer const to #define "),我想理解下面列出的一些句子:
-
关于
#define ASPECT_RATIO 1.653
和const aspect_ratio = 1.653
的比较,Meyers提出"…在浮点常数的情况下(例如在这个例子中),使用该常数可能比使用#define
产生更小的代码。问题是:更小的代码Meyers意味着磁盘上可执行文件的空间更小?为什么它更小?我认为这可能在32位的系统上有效,因为在这种情况下,int
(或指针)需要4字节和双8字节。因为ASPECT_RATIO
可能不会进入符号表,所以名称被替换为值,而在其他情况下,可以使用const
指针指向唯一的双精度值。在这种情况下,这个概念在64位的机器上不再有效(因为指针和双精度是相同的字节数)。我不知道我是否解释得很好,尤其是这个想法是否正确? -
然后Meyers问"…虽然好的编译器不会为整型的
const
对象留出存储空间(除非你创建一个指向该对象的指针或引用),但粗糙的编译器可能会这样做,而且你可能不愿意为这样的对象留出内存……"在这种情况下,内存是由正在执行的进程占用的RAM ?如果验证这一点是正确的,我可以使用任务管理器(在Win)或top(在Linux)?
首先,微优化是愚蠢的。不要担心几个常量双精度值会占用你所有的内存。这不会发生的。如果有,那就处理,而不是在你知道它是相关的之前。
第二,如果使用太多#define
可能会有严重的副作用,即使使用ALL_CAPS_DEFINES
惯例。您迟早会错误地创建一个用于其他变量名称的短宏,而预处理器替换会给您带来无法理解且可避免的错误,并且根本无法调试。正如问题注释中链接的问题所述,宏缺乏命名空间和类作用域,在c++中绝对是糟糕的。
第三,c++ 11增加了constexpr
,它允许类型安全的宏性能常量表达式(不管这个用词不当意味着什么)。甚至还有一些(参见SO Chat中的c++ Lounge)在编译时使用constexpr
进行整个计算。不幸的是,并不是所有声称支持c++ 11的主要编译器,实际上都支持足够多的c++ 11特性来真正有用(我在看你,MSVC2012!)。
- 它"可能"产生更小的代码的原因是,多次使用一个定义可能(可能:优化器做奇怪的事情)也会一次又一次地生成相同的常量。而使用const只会生成一个定义,然后引用同一个定义(如果优化器没有内联计算内容)。
- 链接器在链接可执行文件时输出几个部分。有些部分包含常量,有些部分包含可执行代码。无论你的(操作)系统是否在执行之前将可执行文件加载到ram中,c++标准中没有定义。我使用的系统中代码从闪存执行,所以只有堆栈和动态分配的内存使用ram。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字