10

阅读 Meyers 的书(第 2 项“Prefer const to #define)我想理解下面列出的一些句子:

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

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

4

2 回答 2

7

首先,微优化是愚蠢的。不要在意几个恒定的 double 值会耗尽所有 RAM。它不会发生。如果是这样,那就处理它,而不是在你知道它甚至相关之前。

其次,#define如果使用过多,即使按照ALL_CAPS_DEFINES惯例,也会产生令人讨厌的副作用。迟早你会错误地创建一个用于其他变量名称的短宏,替换预处理器会给你一个深不可测且可避免的错误,并且根本无法调试。正如问题评论中的链接问题所述,宏缺乏命名空间和类范围,并且在 C++ 中绝对不好。

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

于 2013-01-03T14:21:59.323 回答
1
  1. 它“可能”产生较小代码的原因是多次使用定义可能(可能:优化器做奇怪的事情)也一次又一次地生成相同的常量。而使用 const 只会生成一个定义,然后引用相同的定义(如果优化器不计算内联内容)。
  2. 链接可执行文件时,链接器会输出几个部分。有些部分包含常量,有些部分包含可执行代码。您的(操作系统)系统在执行之前是否将可执行文件加载到 ram 中,在 C++ 标准中没有定义。我使用过代码从闪存存储执行的系统,因此只有堆栈和动态分配的内存使用 ram。
于 2013-01-03T14:57:37.133 回答