阅读“梅耶斯之书”(第2项“更喜欢康斯特而不是#定义”),我想理解以下几句话:
#define ASPECT_RATIO 1.653和const aspect_ratio = 1.653之间的比较,Meyers要求“.在浮点常量的情况下(例如在本例中),使用常量可能会产生比使用#define更小的代码。”问题是:使用较小的代码,Meyers意味着磁盘上可执行文件的空间更小?为什么它会变小?我认为这在32位的系统上是有效的,因为在本例中,int (或指针)需要4字节和双8字节。因为ASPECT_RATIO可能不会被输入符号表,所以名称被替换为该值,而在其他情况下,可以使用指向唯一双值的const指针。在这种情况下,这个概念在64位的机器上不再有效(因为指针和双字节是相同的字节数)。我不知道我是否很好地解释了我的意思,尤其是这个想法是否正确?const对象留出存储空间(除非您创建一个指针或对对象的引用),草率编译器可能不愿意为这些对象留出内存……”在这种情况下,内存是否被正在执行的进程占用?如果验证是正确的,我可以使用任务管理器(在Win)或top (在Linux中)?发布于 2013-01-03 14:21:59
首先,微观优化是愚蠢的。不要在意两个恒定的双值消耗了你所有的内存。这不会发生的。如果是这样的话,那就处理它,而不是在你知道它是相关的之前。
第二,如果使用太多,#define可能会产生严重的副作用,即使在ALL_CAPS_DEFINES惯例中也是如此。迟早,您会错误地生成一个用于其他变量名称中的短宏,而预处理器的替换会给您带来一个无法理解和可以避免的错误,并且根本无法调试。正如问题注释中的链接问题一样,宏缺少名称空间和类范围,在C++中肯定是不好的。
第三,C++11添加了constexpr,它允许类型化宏执行(不管这个错误的名称意味着什么)常量表达式。甚至还有那些在编译时使用C++进行计算的人(参见SO中的C++酒廊)。不幸的是,并非所有声称支持C++11的主要编译器实际上都支持足够的C++11特性,使其真正有用(我正在查看您,MSVC2012!)。
发布于 2013-01-03 14:57:37
https://stackoverflow.com/questions/14140506
复制相似问题