#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
不能。这对性能没有影响,但它可能仍然是一个考虑因素。
此外,整型文字——如果使用的话——必须存储在某个地方,即使它是机器指令的直接操作数。这是否可行和有益取决于整数的大小和机器架构。它不依赖于常量是否有名字。
执行以下操作有什么区别:
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
不能。这对性能没有影响,但它可能仍然是一个考虑因素。
此外,整型文字——如果使用的话——必须存储在某个地方,即使它是机器指令的直接操作数。这是否可行和有益取决于整数的大小和机器架构。它不依赖于常量是否有名字。