gpt4 book ai didi

优化相关的C程序条件语句

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:12 24 4
gpt4 key购买 nike

即使条件语句 block 中没有有效语句,条件语句也会被评估吗?如果是,如何优化代码以在这种情况下不评估条件语句?例如:

if( get_value() !=NULL)
{
}

if( get_value() != NULL)
{
do{}while(0);
}

在多个地方,在一个现有的项目中,为了获得调试打印,有这样的检查。可以使用宏函数取消打印,但如何优化条件语句?手动删除这些比较非常困难

最佳答案

C 和 C++ 标准要求编译器确保 get_value() 被求值(或者至少表现得就好像它被求值一样) p>

所以在一般情况下,get_value 将被评估。您可以轻松查看此 with godbolt :

extern int* get_value();

int func() {
if( get_value() !=NULL)
{
}
}

在 gcc 4.4.7 上生成 x86 程序集如下:

    sub     rsp, 8
call get_value()
add rsp, 8
ret

请注意,调用了 get_value(),但不会进行 != NULL 检查,因为该比较是不可观察的。所以对于这个编译器,你可以说严格意义上没有评估完整的比较,但是没有完全消除比较,因为 get_value 仍然必须被调用(这可能是昂贵的部分)。

编译器被迫采用这条路径,因为它不知道 get_value 可能有什么副作用,所以它必须调用它。它可以随意忽略返回值,因为它知道比较和空 if 语句体没有效果。

但是,在一种特殊情况下,编译器可以删除整个语句 - 如果它可以在编译时证明 get_value 方法没有副作用。如果在同一个编译单元中声明了 get_value 方法(并且可能还有一些花哨的链接时优化),这是可能的。

我们更新示例,将 get_value 的实现放在编译单元中,并确保它没有副作用:

int* get_value() {
return 0;
}

int func() {
if( get_value() !=NULL)
{
}
}

现在,方法是compiled into a no-op :

func():
rep
ret

(对于那个显然无用的代表前缀的功能,see here ...)

所以这完全取决于 get_value 的细节,以及编译器在编译你的空 if 语句时能知道多少。

关于优化相关的C程序条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35480177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com