c++ - #define 和 const 的分配

标签 c++ c macros constants c-preprocessor

假设我有一个宏

#define MSG "输入你的名字"

和一个常量

const char* const msg = "输入您的姓氏" 或者 const std::string msg = "输入您的姓氏"

在同一个程序中。

现在,msg 字符串文字将有一个内存位置,该位置将被程序中的每个 msg 引用。

但这同样适用于 MSG,即 MSG 的每次出现都指代相同的字符串文字,还是实际上为每次出现创建了不同的字符串文字?

我的猜测是,由于宏是由预处理器处理的,因此可能会创建重复的字符串文字(不是 100% 确定)。真的吗? 我确信如果它是整数类型,那么重复将无关紧要。

我的问题是针对内存中的存储,但也欢迎其他方面的问题。

换句话说,假设我使用了 100 次 msg,但是使用的内存是恒定的,但是如果 MSG 使用了 100 次,内存使用率是恒定的还是 100 次?

最佳答案

如果字符串在二进制文件中重复 100 次,则二进制文件在内存中的大小会更大 - 但不会影响已用堆的数量。

至于字符串是否会使用#define 重复 100 次?是的,它肯定会,如果您查看源代码的预处理器输出,您会看到这一点。但是,某些编译器可能会在后面的步骤中删除重复项(我假设是链接)。此功能称为字符串池,MSVC 引用在这里:

http://msdn.microsoft.com/en-us/library/s0s0asdt(v=vs.110).aspx

关于c++ - #define 和 const 的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16459721/

相关文章:

c - 这段 C 代码中发生了什么? (来自采访)

c++ - 有没有跨平台的方法来检测 Debug模式编译?

C++如何将类方法传递给要求引用可调用的函数

c++ - Perfect Forwarding - 关于 const 和 non-const ref 的问题

c++ - Visual Studio sizeof 非法操作数

c - 如何设置 Visual Studio 以理解 GCC 定义?

c - 最大值始终设置为 8

CSS 类 "macro"

c++ - 添加包含守卫会破坏构建

c++ - 调用 Process32First() 时如何修复 "The program issued a command but the command length is incorrect."错误?