2

我想要做的是避免以下情况:

if(*ptr > 128) {
   number = 5;
}

当没有明确的分支将走向何方时,此类代码的性能很差。我想出的是:

int arr[] = { number, 5 };
int cond = *ptr > 128;
number = arr[cond];

根据我的测试,当输入是随机的时,它的运行速度是执行条件的两倍多。我想知道是否有更聪明的方法可以做到这一点,也许使用按位运算符。

4

1 回答 1

5

聪明的编译器绝对应该使用正确的优化设置将其编译为条件移动;检查拆卸以确保。

有这个无分支的解决方案:

int mask = -(*ptr > 128);
number = (number & mask) | (5 & ~mask);

最后一行也可以

number = ((mask & (number ^ 5)) ^ 5);

如果您希望减少一项操作。但是,请注意,编译器也几乎无法优化其中任何一个。您最好让编译器担心这个特定的优化,除非您明确知道编译器无法进行优化(在这种情况下,您可能需要检查编译器版本或标志)。

于 2012-09-26T23:48:00.793 回答