const vs #define在现代编译器中

时间:2014-02-04 09:00:01

标签: c++

我已经读过一些事情,说#define并没有占用任何记忆,但是一位同事在工作时非常坚持认为现代编译器没有任何差别。它涉及const int / strings。

#define STD_VEC_HINT 6;
const int stdVecHint = 6;

谈话的结果是因为正在进行现代化处理的旧代码涉及加密,其密钥为#define。

我一直以为变量最终会得到一个可以显示其内容的内存地址,但是在发布版本下进行编译会删除这些内容。

4 个答案:

答案 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;]需要内存分配

为了与旧版本的预处理器兼容,没问题,但未来不清楚

成功