![]() |
1
10
要在整数中翻转位,请使用
gcc已经知道此优化
过来看
on the Godbolt compiler explorer
具有
vs。
为什么是
|
![]() |
2
4
从这个 code run of Godbolt (这段代码基本上包含了我尝试过的几个选项)似乎XORing给出了一个可以做到这一点的语句:-(正如您所说的,切换就是您要寻找的)
归结为的单个指令
具有
这确保了状态在
我让内存访问的另一种选择落空了,因为指针算法和对地址的解引用不会比这两种更快(可能会有内存访问)。
我已经建议了一种基于godbolt中的小混乱的方法。从这里你可以做的是——比较不同的方法,然后得到你得到的时间结果。据推测,你会得到
有趣的是,Peter Cordes在这个例子中 showed 这也适用于布尔人。
用这个
example
很明显,编译器会优化到未优化代码的xoring
|
![]() |
3
3
如果您开始尝试微优化布尔运算,那么您要么过早优化,要么对大量布尔数据执行大量操作。对于前者,答案是不要;对于后者,你可能问错了问题。如果真正的问题是如何优化(许多)布尔数据上的(许多)操作,那么答案是使用基于“标志”的替代表示(即使用更好的算法)。这将允许您以可移植和可读的方式将更多数据放入缓存,并同时执行多个操作和测试。 为什么/如何更好?隐藏物
考虑一个缓存线大小为64字节的系统。64
操作大多数操作都涉及一个或两个(通常非常快)操作和一个测试,而不管您要测试多少个标志。由于这可以同时合并多个值,因此每个操作可以做(通常是32或64倍)更多的工作。 分支由于可以同时完成多个操作和测试,因此可以将最多32个(或64个)可能的分支减少为一个。这可以减少分支预测失误。 可读性
通过使用一个命名良好的掩码常量
可移植性_Bool在早期版本的C中不可用,C++对boolean使用不同的机制;但是,标志将在旧版本的C中工作,并且与C兼容++ 下面是如何使用标志设置掩码的一个实际示例:
此概念可用于同时对模拟的布尔值数组进行操作,例如:
|
![]() |
Ilya Loskutov · 无法将单词加载到寄存器中 2 年前 |
![]() |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
![]() |
Arya · 汇编语言中的“标签”——操作码 2 年前 |
![]() |
S1mple · 通过gcc生成64位共享库时的“未定义的主引用” 3 年前 |
![]() |
R0M2 · 为什么“GCC”忽略汇编代码的-fno pic 3 年前 |
![]() |
Akagi Akira · 如何在gnu汇编程序中组装MIPS cpu 3 年前 |