读汇编与编译器优化:调用约定、栈帧、向量化,以及让 GCC 自己交代为什么没向量化
实测:MS x64 前四个参数在 ecx/edx/r8d/r9d、第 5 个从 0x28(%rsp) 取;-O2 下整数求和循环一条向量指令都没有,-O3 -fopt-info-vec 让 GCC 自己交代原因。
共 8 篇 · 全部标签
实测:MS x64 前四个参数在 ecx/edx/r8d/r9d、第 5 个从 0x28(%rsp) 取;-O2 下整数求和循环一条向量指令都没有,-O3 -fopt-info-vec 让 GCC 自己交代原因。
实测:两份字节数完全相同的 minidump,rbp−rsp 差 28800 倍;栈溢出 handler 里写 dump 四条路线全留 0 字节;编译期可证的除零变成 ud2,终止码都变了。
实测:同一块 128MB 随机跳 99.34ns、顺序扫 3.68ns(27 倍);分层拐点在 64KB/2MB/4MB 三处;AoS/SoA 差 2.77 倍;手工预取没有一档快过不发。
实测:交错释放一半块之后私有内存一个字节没降,HeapWalk 数出 550 万字节空成 5 万个碎片;malloc 尺寸阶梯在 1MB 处翻转;换 VirtualAlloc 切块快 6.4 倍。
实测:自建 PC 采样器量出三热点 59.9%/33.8%/6.2%(理论 62.5/31.2/6.2);GCC 把 noinline 纯函数调用提出循环造成假快 2000 倍;gprof 在 MinGW 输出空表。
本机实证:MinGW 工具链不带 sanitizer 运行时(asan/ubsan/tsan 全部链接失败);本文讲清三个 sanitizer 各查什么,以及拿不到 sanitizer 时的替代手段。
实测:泄漏 1000 个 Pen 后 GDI 计数精确到 1000、500 个 Event 后内核句柄 128→628,清理后归位;WinDbg 与 ETW 未实测。
实测:-g1 只比 -g0 大 2.4% 却够反查到源码行;软件观察点比硬件贵 46 倍;MinGW GDB 11.2 的 record 直接报“架构不支持”。