败犬日报 2025-08-17
1. 低延迟交易设计 之 指针访存(文章)
https://mp.weixin.qq.com/s/HJWyp18uFs5v7sw-yGEopw
2. buildin_ctz(0)
是未定义行为
是的。ref https://gcc.gnu.org/onlinedocs/gcc/Bit-Operation-Builtins.html#index-_005f_005fbuiltin_005fctz
这是因为处理器一般只输出 32 个状态(5 bit),处理 0 就要 33 个状态,于是不支持。
builtin 应该是希望做简单一点的,所以给 0 设成未定义行为了。如果要通用的话就特殊处理 0,比如 std::countr_zero
就是通用的,x86 上汇编就是这样:
cpp
#include <bit>
int foo1(unsigned x) {
return std::countr_zero(x);
// xor eax, eax
// mov edx, 32
// rep bsf eax, edi
// test edi, edi
// cmove eax, edx
// ret
}
int foo2(unsigned x) {
[[assume(x != 0)]];
return std::countr_zero(x);
// xor eax, eax
// rep bsf eax, edi
// ret
}