我有这个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, "%sn", msg);
}} while (0)
我已经读到,上面的内容是调试的最佳实践,因为编译器在使用#define DBGFL 0
进行编译时,会为了优化目的删除if语句来处理if (0)
,并对do { } while (0)
执行相同的操作。
我的问题是:就主代码而言,当预处理器用空语句替换_dbFunction(msg)
时,即使expr
可以是0或=0,编译器是否足够聪明,可以删除整个if并避免比较?
我知道我可能可以通过查看生成的汇编代码来回答自己,然而,我仍然不习惯反汇编可执行文件,我需要了解如何优化我的代码,因为以上内容都在一个长时间运行的for循环中。
感谢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
加载到用于返回值的寄存器中,第二行返回。对CCD_ 9的测试进行了优化。
https://godbolt.org/z/aYE5hc
但是,如果if
条件有副作用,则必须执行。