带有空块的 if 语句 gcc 编译器优化行为
if statement with empty block gcc compiler optimization behaviour
我有这个C代码
char msg[] = "hello";
int expr = some_function_giving_back_integers();
if(expr) {
_dbFunction(msg);
}
其中_dbFunction();
定义如下
#define DBGFL 1
#define _dbFunction(msg) \
do { if (DBGFL) {\
fprintf(stderr, "%s\n", msg); \
}} while (0)
我读到上面是调试的最佳实践,因为编译器在使用 #define DBGFL 0
编译时通过删除 if 语句来处理 if (0)
以进行优化,并遵循相同的do { } while (0)
.
我的问题是:就主要代码而言,当预处理器用空语句替换_dbFunction(msg)
时,即使expr
可以在运行时都是 0 或 !=0,编译器是否足够聪明以删除整个 if 并避免比较?
我知道我可能可以通过查看生成的汇编代码来回答自己,但是,我仍然不习惯反汇编可执行文件,我需要了解如何优化我的代码,因为上面的内容很长-运行 循环。
感谢C专家的一些回答。
提前致谢。
编译 clang -O3
int main(int argc, char *argv[])
{
if (argc > 1) {
do {
if (0) {
printf("foo");
}
} while (0);
}
return 0;
}
生成的代码就是:
main: # @main
xor eax, eax
ret
第一行将 0
加载到用于 return 值的寄存器中,第二行 returns。 argc
的测试被优化掉了。
如果 if
条件有副作用,则必须执行。
我有这个C代码
char msg[] = "hello";
int expr = some_function_giving_back_integers();
if(expr) {
_dbFunction(msg);
}
其中_dbFunction();
定义如下
#define DBGFL 1
#define _dbFunction(msg) \
do { if (DBGFL) {\
fprintf(stderr, "%s\n", msg); \
}} while (0)
我读到上面是调试的最佳实践,因为编译器在使用 #define DBGFL 0
编译时通过删除 if 语句来处理 if (0)
以进行优化,并遵循相同的do { } while (0)
.
我的问题是:就主要代码而言,当预处理器用空语句替换_dbFunction(msg)
时,即使expr
可以在运行时都是 0 或 !=0,编译器是否足够聪明以删除整个 if 并避免比较?
我知道我可能可以通过查看生成的汇编代码来回答自己,但是,我仍然不习惯反汇编可执行文件,我需要了解如何优化我的代码,因为上面的内容很长-运行 循环。
感谢C专家的一些回答。 提前致谢。
编译 clang -O3
int main(int argc, char *argv[])
{
if (argc > 1) {
do {
if (0) {
printf("foo");
}
} while (0);
}
return 0;
}
生成的代码就是:
main: # @main
xor eax, eax
ret
第一行将 0
加载到用于 return 值的寄存器中,第二行 returns。 argc
的测试被优化掉了。
如果 if
条件有副作用,则必须执行。