【问题标题】:C performance: macro vs. constantC 性能:宏与常量
【发布时间】:2022-01-02 22:01:33
【问题描述】:

这两个不同的程序在性能上有什么区别吗?

#define K 50

void main() {
    int k = K;
}
void main() {
    int k = 50;
}

【问题讨论】:

  • 第一个示例可能需要几微秒才能编译
  • main 应在托管实现中声明为返回 int,而不是 void

标签: c performance memory preprocessor


【解决方案1】:

在这种情况下:不,它产生 0 差异(甚至在 -O0 时也没有!)。

这是在我的机器上生成的 ubuntu 20.04 上的汇编器 gcc 10:

.file   "compare_assign.c"
.text
.globl  main
.type   main, @function

main:
.LFB0:
    .cfi_startproc
    endbr64
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $50, -4(%rbp)
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0"
    .section    .note.GNU-stack,"",@progbits
    .section    .note.gnu.property,"a"
    .align 8
    .long    1f - 0f
    .long    4f - 1f
    .long    5
0:
    .string  "GNU"
1:
    .align 8
    .long    0xc0000002
    .long    3f - 2f
2:
    .long    0x3
3:
    .align 8
4:

唯一的区别是源文件的标题(duh):

diff compare_assign_noopt.asm compare_define_noopt.asm 
1c1
<   .file   "compare_assign.c"
---
>   .file   "compare_define.c"

【讨论】:

    【解决方案2】:

    C 中的宏在实际编译阶段之前执行标记替换。

    这意味着经过预处理后,第二段代码与第一段完全相同。

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      相关资源
      最近更新 更多