带有空块的c-if语句gcc编译器优化行为



我有这个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条件有副作用,则必须执行。

相关内容

  • 没有找到相关文章

最新更新