我已经读过一些事情,说#define
并没有占用任何记忆,但是一位同事在工作时非常坚持认为现代编译器没有任何差别。它涉及const int / strings。
#define STD_VEC_HINT 6;
const int stdVecHint = 6;
谈话的结果是因为正在进行现代化处理的旧代码涉及加密,其密钥为#define。
我一直以为变量最终会得到一个可以显示其内容的内存地址,但是在发布版本下进行编译会删除这些内容。
答案 0 :(得分:3)
一个好的编译器不会为可以省略的const变量分配空间。在C ++中,模块范围内的const变量在可见性方面也是隐含的,因此编译器也更容易优化变量。 GCC的链接时间优化功能也有助于进行跨模块优化。
不要忘记更重要的事实,即const变量具有适当的范围和类型安全性,#define定义了。
答案 1 :(得分:1)
与许多人一样认为,这取决于......!
#define
只会将常量直接注入代码中,因此不会占用任何内存。 const
可能也是如此。
但是,您可以使用const
的地址:
const int *value = &stdVecHint;
由于您正在获取其地址,因此编译器需要将常量存储在内存中以生成地址,因此在这种情况下它将需要内存。
答案 2 :(得分:0)
编译器可能会将stdVecHint
的出现位置替换为文字6
,无论它在何处使用。如果你明确地获取它的地址,将占用一个地址和内存空间,但是再次这是一个有争议的点,因为你不能用STD_VEC_HINT
做到这一点。小心翼翼,是的,stdVecHint
是一个带有内部链接的变量,每个看到定义的翻译单元都有自己的副本。在实践中,它不应该增加内存占用。
答案 3 :(得分:0)
预处理器命令使用#define,....等类型的命令。
并且无需分配内存,因为
并用3.14改变常量[#define pi 3.14]的名称,然后编译代码
但是在const命令中[const float pi = 3.14;]需要内存分配
为了与旧版本的预处理器兼容,没问题,但未来不清楚
成功