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)
",答案是肯定的(其他回答者通过查看生成的汇编代码证明了这一点)。
正如其他人的回答,是的,会的。但请务必考虑 所必需的;如果你想确定这一点,只需预先计算它,因为你有所有的元素来做。
我正在尝试了解 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)
",答案是肯定的(其他回答者通过查看生成的汇编代码证明了这一点)。
正如其他人的回答,是的,会的。但请务必考虑 所必需的;如果你想确定这一点,只需预先计算它,因为你有所有的元素来做。