性能和内存使用方面的"静态const","#define"和"enum"之间的区别

use*_*ser 4 c c++ performance gcc compilation

可能有任何因为内联的#define陈述.

我理解答案可能是编译器依赖的,然后让我们假设GCC.

关于CC++已经存在类似的问题,但它们更多地涉及使用方面.

Lee*_*eor 6

编译器会将它们视为给定的基本优化.
检查相当容易 - 考虑以下c代码:

#define a 1
static const int b = 2;
typedef enum {FOUR = 4} enum_t;

int main() {

    enum_t c = FOUR;

    printf("%d\n",a);
    printf("%d\n",b);
    printf("%d\n",c);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用gcc -O3编译:

0000000000400410 <main>:
  400410:       48 83 ec 08             sub    $0x8,%rsp
  400414:       be 01 00 00 00          mov    $0x1,%esi
  400419:       bf 2c 06 40 00          mov    $0x40062c,%edi
  40041e:       31 c0                   xor    %eax,%eax
  400420:       e8 cb ff ff ff          callq  4003f0 <printf@plt>
  400425:       be 02 00 00 00          mov    $0x2,%esi
  40042a:       bf 2c 06 40 00          mov    $0x40062c,%edi
  40042f:       31 c0                   xor    %eax,%eax
  400431:       e8 ba ff ff ff          callq  4003f0 <printf@plt>
  400436:       be 04 00 00 00          mov    $0x4,%esi
  40043b:       bf 2c 06 40 00          mov    $0x40062c,%edi
  400440:       31 c0                   xor    %eax,%eax
  400442:       e8 a9 ff ff ff          callq  4003f0 <printf@plt>
Run Code Online (Sandbox Code Playgroud)

绝对相同的汇编代码,因此 - 完全相同的性能和内存使用.

编辑:正如达蒙在评论中所说的那样,可能会出现一些诸如复杂的非文字之类的极端情况,但这有点超出了问题.

  • 有趣的大写选择:小写的宏和所有大写的枚举:) (3认同)
  • 不幸的是,对于_many_非整数文字的情况,"相同"并非如此.例如,您可能期望"静态const"也可以简单地进行优化,但事实并非如此.例如`struct foo {int bar;}; static const&bar_ref = foo.bar;`肯定比`#define bar_ref foo.bar`更多的开销.(是的,实际上你需要这样的憎恶.不要问.) (3认同)