我有一些经常使用的代码,希望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
编译选项,即使我知道它不需要(c < 4)比较,GCC仍然会生成该比较,因为bar
函数的前提条件是c为0或1。如果没有使用-DNDEBUG
,GCC确实会删除该比较,因为它被断言隐含了-但是您会有额外的断言开销(这实际上更多)。是否有一种方法将变量范围传达给GCC,以便进行优化?
如果CLang在这方面做得更好,我也可以考虑切换编译器。
c < 4
。您可以在 https://godbolt.org/g/3Hp4ZA 上使用各种编译器进行检查,我检查过的没有一个能够优化这个问题(这是有道理的)。理想情况下,应该有一些神奇的 pragma 来指定 bar 中 c 的范围,但我认为还没有人想出这样的 pragma... 或者可能是一些智能的 assert 内置函数,它可以从生成的代码中删除自己,但被优化器识别。 - valiano