C/C++ 中的编译时按位运算

Compile-time bitwise operations in C/C++

我正在尝试了解 C/C++ 编译器如何处理按位运算。 具体来说,我说的是用 gcc 编译的 C,但我认为这个问题比那个更笼统。

无论如何,假设我有一个定义如下的宏:

  #define SOME_CONSTANT 0x111UL
  #define SOME_OFFSET   2
  #define SOME_MASK     7
  #define SOME_VALUE    ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK)

  static inline void foo() { printf("Value: %lu#n", SOME_VALUE); }

SOME_VALUE的所有成分都是常量,它们在编译时都是已知的。

所以我的问题是:gcc 会在编译时求值 SOME_VALUE,还是只在运行时求值? 如何检查 gcc 是否支持此类优化?

will gcc evaluate SOME_VALUE at compile time

我不知道你的,我的知道

How do I check whether a gcc supports such optimization?

我使用-S标志生成汇编代码并检查了它

    movl    , %esi

是的,gcc 会优化它,因为它是一个完全常量的表达式。

要检查它,请查看汇编代码,例如使用此工具 https://gcc.godbolt.org/

#include <stdio.h>

#define SOME_CONSTANT 0x111UL
#define SOME_OFFSET   2
#define SOME_MASK     7
#define SOME_VALUE    ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK)

void foo() { printf("Value: %lu#n", SOME_VALUE); }

我不得不稍微修改一下你的代码,否则 gcc 会优化掉整个东西,什么都不留下!

.LC0:
    .string "Value: %lu#n"
foo():
    movl    , %esi
    movl    $.LC0, %edi
    xorl    %eax, %eax
    jmp printf

您的编译器不知道 SOME_VALUE。 C 代码首先通过 C 预处理器传递给 C 编译器。您可以通过 运行 gcc 查看 C 预处理器的输出:

gcc -E code.c

您将看到提供给 C 编译器的真实代码是:

int main(void) {
 printf("Value: %lu#n", ((0x111UL) << (2)) & (7));
 return 0;
}

所以问题变成"Does C Compiler of GCC optimize ((0x111UL) << (2)) & (7)",答案是肯定的(其他回答者通过查看生成的汇编代码证明了这一点)。

正如其他人的回答,是的,会的。但请务必考虑 所必需的;如果你想确定这一点,只需预先计算它,因为你有所有的元素来做。