分支预测优化最常用、提升最大让 CPU 预测正确减少流水线停顿热点 if 必用。// 内核标准写法 #define likely(x) __builtin_expect(!!(x), 1) // 大概率为真 #define unlikely(x) __builtin_expect(!!(x), 0) // 小概率为真 if (unlikely(error)) { // 错误分支很少走 handle_error(); } if (likely(ok)) { // 正常分支经常走 do_work(); }效果减少分支预测失败性能提升5%~30%。位运算加速比手写循环快 10~100 倍全部直接映射 CPU 指令无循环、零开销。| 函数 | 用途 | 例子 |---|------__builtin_popcount(x)| 统计 1 的个数 | 0b1010 → 2__builtin_clz(x)| 前导零个数32 位 | 0b100 → 29__builtin_ctz(x)| 末尾零个数 | 0b100 → 2__builtin_ffs(x)| 最低位 1 的位置 | 0b100 → 3用途哈希、加密、位图、嵌入式、算法优化。数据预取降低缓存不命中提前把「马上要用的数据」从内存读到 CPU 缓存里等你真正用的时候直接从缓存取速度快 10~100 倍。CPU 访问速度寄存器 L1 缓存 L2 缓存 L3 缓存 内存最慢__builtin_prefetch就是手动控制缓存加载减少「缓存不命中cache miss」。函数原型void __builtin_prefetch (const void *addr, int rw, int locality);函数参数addr要预取的内存地址数组、结构体、指针都行。rw读写模式0 预取用来读99% 场景用这个1 预取用来写locality局部性保留时间0取完不用保留temporal locality 01短暂保留2较长保留3最久保留默认、最常用适用场景遍历大数组 / 链表图像处理数据库 / 网络批量处理效果内存密集型代码提速10%~50%。最常用的 2 行代码// 读预取90% 场景 __builtin_prefetch(ptr, 0, 3); // 写预取 __builtin_prefetch(ptr, 1, 3);什么时候用只在「遍历大数据结构」时用遍历大数组 1KB遍历链表图像处理数据库、网络批量处理循环里每次访问不连续、跳很远的内存什么时候不要用小数据、已经在缓存里循环很短、访问很快预取反而增加指令开销得不偿失最经典实战例子数组遍历未优化for (int i0; iN; i){ sum arr[i]; // 经常 cache miss很慢 }优化后预取未来数据for (int i0; iN; i){ // 预取 未来 8 步后的数据 __builtin_prefetch(arr[i8], 0, 3); sum arr[i]; }为什么 8因为CPU 做预取需要时间你要提前几步预取等循环跑到时数据已经在缓存里了常用预取距离4~16之间。链表遍历优化链表内存不连续cache miss 极高prefetch提升巨大struct node *p head; while (p) { // 预取下下个节点 if (p-next) __builtin_prefetch(p-next-next, 0, 3); process(p); // 处理当前节点 p p-next; }提速20%~80%非常常见。与优化等级关系-O0Debug 模式__builtin_prefetch会生成预取指令真的会执行不是被删掉。-O1/-O2/-O3同样会生成预取指令而且优化效果更好。为什么要开 O2 才有用因为__builtin_prefetch的作用 减少 cache miss但-O0代码本身跑得极慢慢到内存访问延迟本来就巨大CPU 执行速度慢预取带来的收益被淹没了甚至测不出来性能提升简单说-O0 下预取会执行但优化效果几乎看不见。-O2 下代码跑得快cache miss 影响巨大预取效果非常明显。-O0Debug不优化代码不自动预取不自动向量化你写prefetch→真的会插入预取指令但整体代码太慢看不出提升-O2Release编译器会自动做一些预取你手动写__builtin_prefetch→强化预取、精准预取性能提升肉眼可见关键要点它是非阻塞的不等待加载完成不卡住 CPU。不会崩溃预取非法地址也不会段错误只是无效操作。只对大内存有效小数组预取没用。不要预取得太近 or 太远太近来不及加载太远数据还没用就被踢出缓存__builtin_prefetch在任何优化级别都会执行O2 及以上优化才有效-O0 下看不出效果等于白加debug 模式下可能被忽略。__builtin_prefetch 是给 Release 版本-O2用的优化手段不是给 Debug 用的。内存操作零开销比 memcpy 更快GCC 自动内联展开无函数调用开销。__builtin_memcpy(dst, src, n); __builtin_memset(ptr, 0, n); __builtin_memmove(dst, src, n);开启-O2后编译器会自动把标准库函数替换成这些。安全溢出检查高效且安全比自己写if(a INT_MAX - b)快得多。int res; if (__builtin_add_overflow(a, b, res)) { // 溢出处理 }支持add/sub/mul无符号 / 有符号都能用。对齐提示向量化优化神器告诉编译器指针是对齐的自动启用 SIMD 指令。// 承诺 ptr 按 32 字节对齐 int *p __builtin_assume_aligned(ptr, 32);效果循环自动向量化提速2~4 倍。性能优化 Top5 内建函数这 5 个记住就够覆盖 99% 性能优化场景likely() / unlikely()分支预测__builtin_prefetch()缓存预取__builtin_popcount/clz/ctz位运算__builtin_assume_aligned()向量化__builtin_add_overflow安全运算