保留执行管道

问题描述 投票:0回答:2

经常检查返回类型是否有错误。但是,将继续执行的代码可以通过不同的方式指定。

if(!ret)
{
   doNoErrorCode();
}
exit(1);

if(ret)
{
   exit(1);
}
doNoErrorCode();

重量级 CPU 可以使用简单的统计来推测在附近/位置附近采取的分支 - 我研究了一种用于分支推测的 4 位机制 (-2,-1,0,+1,+2),其中零是未知的,并且2 将被视为真正的分支。

考虑到上面的简单技术,我的问题是如何构建代码。我认为主要编译器和主要体系结构之间必须有一个约定。这是我的两个问题

  1. 当代码不是经常访问的循环时,当管道被填充时,哪个布尔值会偏向?
  2. 有关分支的推测必须从真、假或零开始(管道必须填充一些东西)。可能是哪个?
c cpu-architecture micro-optimization
2个回答
2
投票

不同 CPU 的行为有所不同,编译器经常对指令重新排序。 您将在这些手册中找到所需的所有信息:http://agner.org/optimize/

在我看来,了解发生情况的唯一方法是读取编译器生成的汇编代码。


2
投票

在 gcc 上,您可以使用

__builtin_expect
为编译器提供分支预测信息。为了使其稍微容易一些,您可以借用可能/不太可能使用的宏,例如在 Linux 内核中:

#定义可能(x) __builtin_expect((x),1)
#定义不太可能(x) __builtin_expect((x),0)

然后例如

if (unlikely(!some_function())
    error_handling();
© www.soinside.com 2019 - 2024. All rights reserved.