【问题标题】:GCC optimization of __builtin functions used in a macro宏中使用的 __builtin 函数的 GCC 优化
【发布时间】:2012-05-14 03:17:19
【问题描述】:

如果我有这样的宏:

#define MAX_SIZE ((1<<18)-1)

我可以放心,到运行时,这个数学运算已经完成并且 MAX_SIZE 是一个文字。

我的问题是,如果我使用 __builtin 函数,例如:

#define BIT_OFFSET (__builtin_clz(MAX_SIZE))

这是否也会在运行时变成一个常数?

【问题讨论】:

  • 宏是纯文本替换。如果__builtin_clz() 不是宏,它会在运行时执行。大多数编译器都有一个标志,如果你想看看到底发生了什么,它将输出你的文件后预处理。
  • __builtin_* 系列函数不是 gcc 内部函数,暗示除非明确禁用,否则它们会被内联?
  • GCC 内在函数是 GCC 内在函数,而不是宏。有时它们是通过函数调用实现的,有时它们是内联的,有时它们是在编译时评估的。我不知道这个特定的是否可以在编译时评估。
  • 我不是 100% 确定,但我认为 GCC 的所有 __builtin_* 函数都是特殊情况下的常量参数并生成一个常量结果,该结果可以在 C 的“常量表达式”意义上使用(即,您甚至可以将它们用作位域宽度、结构中数组的大小等)。
  • @R.. 文档中没有任何说明,我们可以确定 __builtin_abort 等不会产生恒定的结果。

标签: c gcc macros


【解决方案1】:

对于某些值、某些机器和某些编译器的某些版本,__builtin_clz(constant) 将在编译时进行评估。但是不能保证它会在编译时针对所有值、所有机器和所有编译器进行评估。使用 gcc -S 查看你的编译器在你的目标机器上做了什么。

【讨论】:

  • 好吧,在编译一个测试程序并反汇编后发现是的,在这种情况下它被优化为一个字面值。
  • @vaebnkehn 你不接受这个答案是因为......?
  • 你去!有一些网点?
  • @vaebnkehn 欢迎在 9 年后回到 SO。 :-)
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
相关资源
最近更新 更多