【问题标题】:Why do we say #define Processor creates multiple copies in program?为什么我们说#define Processor 在程序中创建多个副本?
【发布时间】:2015-04-25 07:05:49
【问题描述】:

我刚刚在 item 2: Prefer const, enum and inline to #define 中阅读 Effective C++, 第三版 一书给出的原因是在使用#define 时,预处理器会在我们的目标代码中创建#define 的多个副本。我真的不明白为什么预处理器会创建#define 的多个副本?因为我所知道的是它只是替换它找到那个宏的地方。

另外,当我为我的代码创建汇编代码时,我几乎得到了相同的汇编代码?

例如:

int main()                            
{
   const int MAGICNUM 5;      
   int i=MAGICNUM*1;
   int j=MAGICNUM*2;
   int k=MAGICNUM*3;
   int l=MAGICNUM*4;
   int m=MAGICNUM*5;
} 

对应的汇编代码:

0004 C745E805       movl    $5, -24(%rbp)
     000000
000b C745EC05       movl    $5, -20(%rbp)
     000000
0012 C745F00A       movl    $10, -16(%rbp)
     000000
0019 C745F40F       movl    $15, -12(%rbp)
     000000
0020 C745F814       movl    $20, -8(%rbp)
     000000
0027 C745FC19       movl    $25, -4(%rbp)
     000000

即使我使用#define,我也得到了相同的代码。使用 assembly.ynh.io 生成的汇编代码。

【问题讨论】:

  • 这取决于类型。如果你#define一个字符串,你可能会得到多个副本。
  • 尝试一些比整数更简单的东西。
  • 它说你可以得到多个副本。

标签: c++ constants


【解决方案1】:

如果您使用#define 创建一个基本类型(如 int)的命名常量,那没关系,因为预处理器总是“知道”什么是 int,但在这种情况下,最好使用 const(或c++11 中的 constexpr) 变量,因此编译器将确定类型并进一步优化您的代码。如果您在#define 中创建一个类对象,情况会有所不同,因为如果您在另一个翻译单元中使用它,则会构造另一个对象。

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2017-06-20
    • 2014-10-29
    • 1970-01-01
    相关资源
    最近更新 更多