【问题标题】:Does a macro allocate memory? [duplicate]宏是否分配内存? [复制]
【发布时间】:2016-07-05 06:56:34
【问题描述】:

宏是否在段中分配内存?如果是,那么NUMBER存储在哪个内存段?

#define NUMBER 10

【问题讨论】:

  • 发件人:gcc.gnu.org/onlinedocs/cpp/…“类似对象的宏是一个简单的标识符,它将被代码片段替换……然后 C 预处理器将识别并扩展宏……C 编译器将看到相同的标记,如果你有写”
  • NUMBER 在编译时分配动态内存(在编译器的堆中)。编译后的程序没有分配——至少宏没有分配。
  • 好吧,学究起来,它将占用内存到.text (code segment) 部分。 ;) 每次都在代码中使用。

标签: c++ c memory macros


【解决方案1】:

不,宏不能那样工作。

它们被预处理器替代。 编译器 看不到NUMBER。它所看到的只是文字10

在这方面,C 和 C++ 是相同的。

【讨论】:

    【解决方案2】:

    没有为宏分配内存。编译代码时,宏在所有使用它的地方都会被机械地替换为它的值。

    【讨论】:

      【解决方案3】:

      ,宏不分配内存。

      这些语句不像变量赋值,没有分配内存。请记住,预处理器在编译之前起作用。

      NUMBER 仅在 pre-processing 阶段相关,并且在运行时没有任何标识。在预处理期间,NUMBER 的所有实例都被替换为 10。因此在运行时不需要内存,因为 10 是一个整数文字(编译时)。

      请阅读参考link

      【讨论】:

        【解决方案4】:

        不,一般来说,#define 指令不会分配任何内存。

        详细地说,#define 是一个替换指令。它所做的只是在预处理阶段进行文本替换。

        所以,像这样的文本代码

        #define NUMBER 10
        .
        .
        .
        if (val == NUMBER)
        

        看起来像

        if (val == 10)
        

        预处理后。因此,#define 定义的宏替换不占用任何单独的内存。 FWIW,替换(文字)值将占据代码段中的通常位置(与您编写的后一种格式相同,使用直接文字值,没有 MCARO)。

        相关,来自 C11,第 §5.1.1.2/p4 章,翻译阶段

        预处理指令被执行,宏调用被扩展,并且 _Pragma 一元运算符表达式被执行。 [...]

        【讨论】:

          【解决方案5】:

          此定义不会在您的程序中分配内存。

          它只是告诉预处理器(编译器的一部分)用10 替换标记NUMBER 的更多实例。

          不过,它可能会在预处理器中分配一些字节。

          【讨论】:

            【解决方案6】:

            #define 本身不占用任何内存,发生的情况是编译器 - 在预编译阶段 - 将代码中所有出现的 NUMBER 替换为定义,在您的情况下为 10。

            【讨论】:

              猜你喜欢
              • 2019-12-10
              • 2016-03-04
              • 2019-08-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多