Skip to content

败犬日报 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
}