c - 在 C 中进行谓词赋值的更好方法?

标签 c

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

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

如果没有关于分支将走向何方的明确模式,则此类代码的性能会很差。我想到的是这个:

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

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

最佳答案

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

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

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

最后一行也可以

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

如果您希望使用更少的操作。但是,注意买者,编译器几乎无法同时优化其中任何一个。您最好将此特定优化留给编译器来操心,除非您明确知道编译器无法进行优化(在这种情况下,您可能需要检查编译器版本或标志)。

关于c - 在 C 中进行谓词赋值的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12612016/

相关文章:

c sendfile 第二次不起作用

c - 如何将二维字符串数组分配给字符指针数组?

c - 如何在列表中添加更多字段

c - C 语言中 strdup() 的实现

在 OpenGL 中使用 GTK2+ 时出现编译错误?

c - C 语言无法识别字符串

python - 'io.h' : No such file or directory during "pip install netifaces"

c++ - Bit hack 根据第二个值返回两个值之一

c - 多次发送,多次接收

c - 如何从 I2C 总线冲突 BCLIF 中恢复?