在不使用可能会导致管道失效的逻辑语句(如a > b ? a : b
?
我正在使用巨大的3D阵列并进行大量的循环迭代。
答案 0 :(得分:6)
检查编译器输出的内容,它可能已经“最佳”了。例如,
float foo(float a, float b)
{
return (a>b?a:b);
}
使用GCC 4.5 -O3
编译,在x86_64上生成此程序集:
Disassembly of section .text:
0000000000000000 <foo>:
0: f3 0f 5f c1 maxss %xmm1,%xmm0
4: c3 retq
即。编译器非常了解您所针对的指令集以及代码的语义。让它发挥作用。
答案 1 :(得分:0)
好吧,我不认为这比使用分支更快,但这似乎有效:
#include <stdio.h>
#define FasI(f) (*((int *) &(f)))
#define FasUI(f) (*((unsigned int *) &(f)))
#define lt0(f) (FasUI(f) > 0x80000000U)
#define le0(f) (FasI(f) <= 0)
#define gt0(f) (FasI(f) > 0)
#define ge0(f) (FasUI(f) <= 0x80000000U)
int main()
{
float a=11.0,b=4.6;
float x=a-b,y=b-a;
printf("%f\n",lt0((y))*a+lt0((x))*b);
return 0;
}