#define vs const global

时间:2020-11-01 02:02:46

标签: c c-preprocessor

执行以下操作有什么区别?

const int var1=100;
#define   var2 200

int main(int argc, char* argv[]) 
{

}

var2是否占用地址/值,或者被编译器替代?什么时候可以使用另一个?

2 个答案:

答案 0 :(得分:1)

在您的示例中,var2只是将被C预处理程序替换的文本。在甚至编译程序之前,预处理器都会解析源文件,并用扩展文本(在您的示例中为数字200)替换任何出现的“ var2”(不在注释或字符串文字中)。它不占用内存空间,因为编译器甚至看不到“ var2”,而只看到数字常量文字“ 200”。

var1是不可修改的左值(即确实存在于内存中)。当您使用关键字const限定变量定义时,只要程序尝试修改变量,编译器就会抛出错误。

使用#define var2 200之类的宏确实具有性能上的好处-即您的程序将占用更少的内存(因为堆栈上的变量较少),并且您的程序可能运行得更快(可能忽略不计)(因为处理器没有不必总是从内存中加载值。

但是,宏可能容易出错,并且在大多数性能密集型应用程序中,使用const变量的保护措施通常会超出成本。仍然,当今的编译器非常聪明,可以对const变量进行优化以进一步降低性能成本。

答案 1 :(得分:1)

除非您在&上使用var1地址操作符,否则编译器没有义务为其提供固定地址。 (如果使用外部链接定义变量,虽然可能会这样。)

即使您确实使用了var1的地址,编译器也有权用已知值替换对该变量的引用。因此,两种定义常量的方式在运行时没有真正的区别。

在编译期间,有一个区别:var2可以用在编译器需要常量(例如大小写标签或数组大小)的地方,而var1不需要。这对性能没有影响,但可能仍是一个考虑因素。

此外,即使使用整数,也必须将其存储在某个位置,即使它是机器指令的直接操作数。这是否可行和有益取决于整数的大小和机器体系结构。这不取决于常量是否具有名称。