#define 与 const 全局

#define vs const global

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

const int var1=100;
#define   var2 200

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

}

var2是占用了一个address/value还是被编译器替代了?什么时候用一个代替另一个?

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

然而,

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

使用像 #define var2 200 这样的宏确实有性能优势 - 即您的程序将占用更少的内存(因为堆栈上的变量更少)并且您的程序可能 运行 一点(可能可以忽略不计)更快(因为处理器不必总是从内存中加载值)。

但是,宏可以是 error-prone,除了在大多数 performance-intense 应用程序中,使用 const 变量的安全措施通常超过成本。不过,今天的编译器非常聪明,可以对 const 变量进行优化,以进一步降低性能成本。

除非你在var1上使用&address-of运算符,编译器没有义务给它一个固定的地址。 (虽然它可能会,如果变量是用外部链接定义的。)

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

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

此外,整型文字——如果使用的话——必须存储在某个地方,即使它是机器指令的直接操作数。这是否可行和有益取决于整数的大小和机器架构。它不依赖于常量是否有名字。