gpt4 book ai didi

c - 有没有办法将条件分配转换为无分支代码?

转载 作者:行者123 更新时间:2023-12-02 09:20:01 25 4
gpt4 key购买 nike

有没有办法将以下 C 代码转换为没有任何条件语句的内容?我已经分析了我的一些代码,并注意到它在与这个非常相似的 if 语句上有很多分支未命中。

int cond = /*...*/;
int a = /*...*/;
int b = /*...*/;

int x;
if (cond) {
x = a;
} else {
x = b;
}

最佳答案

这取决于您所针对的指令集。对于 x86,有 cmov .对于 arm64,有 csel .对于 armv7,有 mov带有可选的条件操作码。

任何体面的编译器都应该能够将您拥有的代码优化为最优化的指令集。 GCC 和 clang 这样做(在 https://gcc.godbolt.org/ 上自己尝试一下)。

更直接地回答您的问题:无法在直接 C 中强制执行此操作,因为 CPU 指令集可能没有可用作替代的无分支指令。所以你要么依赖你的编译器(这可能是个好主意),要么手写你自己的程序集。

给你一个小例子,考虑下面的 C 代码:

int min(int a, int b) {
int result;
if (a < b) {
result = a;
} else {
result = b;
}
return result;
}

armv7 的 gcc 5.4.1 生成:
min(int, int):
cmp r0, r1
movge r0, r1
bx lr

arm64 的 gcc 5.4 生成:
min(int, int):
cmp w0, w1
csel w0, w0, w1, le
ret

x86 的 clang 4.0 生成:
min(int, int):                               # @min(int, int)
cmp edi, esi
cmovle esi, edi
mov eax, esi
ret

x86 的 gcc 5 生成:
min(int, int):
cmp edi, esi
mov eax, esi
cmovle eax, edi
ret

x86 的 icc 17 生成:
min(int, int):
cmp edi, esi #8.10
cmovl esi, edi #8.10
mov eax, esi #8.10
ret #8.10

如您所见,它们是 全部 无分支(在 -O1 或更高版本编译时)。

关于c - 有没有办法将条件分配转换为无分支代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com