c - #define 与 const 全局
问题描述
执行以下操作有什么区别:
const int var1=100;
#define var2 200
int main(int argc, char* argv[])
{
}
是var2
占用地址/值还是被编译器替换?什么时候会使用一个而不是另一个?
解决方案
在您的示例中,var2
只是要被 C 预处理器替换的文本。在程序甚至编译之前,预处理器解析源文件并用扩展文本替换任何出现的“var2”(不在注释或字符串文字中),在您的示例中是 number 200
。它不占用内存空间,因为编译器甚至看不到“var2”,它只看到数字常量文字“200”。
var1
但是,它是一个不可修改的左值(即它确实存在于内存中)。当您使用关键字限定变量定义时const
,编译器将在程序尝试修改变量时抛出错误。
使用宏#define var2 200
确实具有性能优势 - 即您的程序将占用更少的内存(因为堆栈上的变量更少)并且您的程序可能运行得更快(可能可以忽略不计)(因为处理器不必总是加载值从记忆里)。
但是,宏可能容易出错,并且除了在性能最密集的应用程序中,使用const
变量的保护措施通常超过成本。尽管如此,今天的编译器非常聪明,可以对const
变量进行优化,以进一步降低性能成本。
推荐阅读
- data-distribution-service - DDS 参与者在终止时不会立即取消注册
- javascript - 富文本编辑器并通过提交按钮获得焦点
- java - 类变量上的空指针异常
- flutter - 颤动的gridView子高度固定,添加其他小部件无法显示?
- android - 如何在 OnClick 中查找数据库中的 ID?
- swift - 如何在swift的单元测试中验证是否在具体类中调用了方法
- python - 使用 pyper 返回 None 的函数
- python - csv文件中行的匹配字符串
- mongodb - 春季安全认证
- ruby-on-rails - 尝试在我的 rails 5.x 应用程序中为我的自定义布局导入引导库