【发布时间】:2015-02-22 23:06:00
【问题描述】:
例子:
#define Var1 35
static const int Var1( 35);
因此,虽然#define 在编译时用35 替换了我使用Var1 的所有地方(如果你有很多编译时间,我认为这会使编译时间稍长一些,因为它会解析代码) ,使用static const int 会使编译器将其视为变量。
这是否意味着当使用static const int 时,它会增加我的程序的内存印记,因为它必须为所有这些常量使用内存,或者编译器是否已经对这种开销进行了优化?
我问的原因是因为我想知道在这样的情况下是否会更好,在调试模式下将它们设置为static const ints(这样你可以在调试时轻松查看值)但让它们#defines 处于发布模式,因此它会使程序更小。
【问题讨论】:
-
大小差异可以忽略不计,更改发布版本中的整个定义意味着您没有在调试模式下正确测试它(因为代码不一样)。除非您处于非常紧张的内存情况,否则将它们声明为
static const并忘记与内存问题相关的过早优化,以便节省这么少的钱。 (如果你把它放在一个位置并#include它,你可以在多个地方重复使用相同的 const 声明。) -
如果您不能相信编译器能够正确处理此类琐碎的事情,那么您不应该相信它能够正确执行任何操作,而应该使用不同的编译器。如果你觉得你必须对这样的事情进行微观管理,那么某处是非常错误的。
-
很可能,编译器会为您完成这项工作。
static东西很容易优化。 -
优化器可能会将其作为常量传播的一种形式来处理,您可以在类似的问题Do temp variables slow down my program? 中看到,即使变量不是 const,编译器也可以消除它们。像我在回答中那样使用 Godbolt,您可以快速研究简单的示例。
标签: c++ constants c-preprocessor