C++分支预测提示



考虑两个等价函数

void foo( )
{
if( unlikely_case )
return;

// foo code
}
void foo( )
{
if( !unlikely_case )
{
// foo code
}
}

显然,编译器无法决定哪种情况更有可能——但我提前知道了。

我觉得我应该用后一种形式来构建我的代码,因为它支持我所知道的分支预测。

问题是这可能会得到丑陋的

void foo( )
{
if( !sanity_check[ 0 ] )
return;
if( !sanity_check[ 1 ] )
return;
if( !sanity_check[ 2 ] )
return;
// foo code
}

void foo( )
{
if( sanity_check[ 0 ] )
if( sanity_check[ 1 ] )
if( sanity_check[ 2 ] )
{
// foo code
}
}

有没有一个关键字可以让编译器知道哪些情况更有可能(可能取决于编译器(?如果不是,编译器在优化代码进行分支预测时是否会考虑这些健全性检查情况?我应该习惯金字塔形的后一种代码吗?

为了解决这个问题,只考虑最流行的编译器,如MSVC、GCC、clang等。

是的,使用__builtin_expect内置函数,请在此处查看更多信息。

无论如何,作为一般规则,首先写入最可能的if分支,它们将在之前执行(例如,switch块可能不是这样(。

最新更新