gpt4 book ai didi

gcc - 有没有办法告诉 GCC 参数的范围?

转载 作者:行者123 更新时间:2023-12-05 04:10:15 25 4
gpt4 key购买 nike

我有一些频繁使用的代码,我希望 GCC 对其进行积极优化。但我也想编写干净、可重用的代码,其中包含从多个地方调用的(可内联)函数。在内联函数中有一些我知道可以删除的代码,因为条件永远不会发生。

让我们看一个具体的例子:

#include <assert.h>

static inline int foo(int c)
{
if (c < 4)
return c;
else
return 4;
}

int bar(int c)
{
assert(c < 2);

return foo(c);
}

使用 -DNDEBUG -O3,GCC 仍会生成 (c < 4) 比较,即使我知道它不需要,因为 bar 函数的前提条件是 c 是 0 还是 1。如果没有 -DNDEBUG,GCC 确实 删除了比较,因为断言暗示了它 - 当然你然后有断言的开销(更多)。

有没有办法将变量范围传递给 GCC,以便将其用于优化?

如果 CLang 可以在这方面做得更好,我也可以考虑切换编译器。

最佳答案

您可以在测试中使用 __builtin_unreachable(阅读 other builtins)来告诉编译器,例如,

if (x<2 || x>100)
__builtin_unreachable();
// Here the compiler knows that x is between 3 and 99 inclusive

在您的情况下,将其添加到您的 bar 的开头(可能包含在一些漂亮的宏中):

if (c >= 2)
__builtin_unreachable();

如果您进行强烈优化(例如,至少 -O2),编译器知道 x 在 3 到 99 之间(最新版本的 GCC 包含代码来做这样的分析——至少像上面那样处理简单恒定间隔约束——并在以后的优化过程中利用它们。

但是,我不太确定你应该使用它! (至少不要经常使用它并将其包装在一些类似 assert 的宏中),因为它可能不值得麻烦,并且因为编译器实际上只能处理和传播 简单约束(其详细信息是特定于编译器版本的)。

据我所知,最近Clang GCC 接受内置的。

同时查看 __builtin_trap(它也会发出运行时代码)。

关于gcc - 有没有办法告诉 GCC 参数的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44723954/

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