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

GTA*_*GTA 9 c++

阅读Meyers一书(第2项"更喜欢const到#define")我想理解下面列出的一些句子:

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

  2. 然后迈耶斯问道:"虽然好的编译器不会const为整数类型的对象留出存储空间(除非你创建一个指针或对象的引用),但是你可能不愿意为这样的编译器留出内存对象..."在这种情况下,内存是执行过程占用的RAM?如果验证这是正确的我可以使用任务管理器(在Win中)或顶部(在Linux中)?

rub*_*nvb 6

首先,微观优化是愚蠢的.不要关心几个不断的双重值占用你所有的RAM.它不会发生.如果确实如此,那就处理它,而不是在你知道它甚至相关之前.

其次,#define即使使用ALL_CAPS_DEFINES惯例,如果使用太多也会产生令人讨厌的副作用.迟早你会错误地制作一个在其他变量名称中使用的短宏,预处理器替换会给你一个不可思议和可避免的错误,根本就没有可调试性.正如问题评论中的链接问题所述,宏缺乏命名空间和类范围,并且在C++中肯定是不好的.

第三,C++ 11补充说constexpr,它允许类型安全的宏性能(无论这个误称应该是什么意思)常量表达式.甚至有些人(参见SO Chat中的C++ Lounge)在编译时使用完整的计算constexpr.不幸的是,并非所有主要的编译器声称支持C++ 11,实际上支持足够的C++ 11功能才真正有用(我在看你,MSVC2012!).

  • 谢谢回复.我的目标不是优化,而只是理解我指出的短语的含义 (2认同)