Windows 侧调试与性能
实测:泄漏 1000 个 Pen 后 GDI 计数精确到 1000、500 个 Event 后内核句柄 128→628,清理后归位;WinDbg 与 ETW 未实测。
实测:泄漏 1000 个 Pen 后 GDI 计数精确到 1000、500 个 Event 后内核句柄 128→628,清理后归位;WinDbg 与 ETW 未实测。
实测:模态循环派发整条线程的消息,嵌套模态里第一层的定时器照样跳;回车属于 DM_GETDEFID;ListView 关重绘快 8 倍、虚拟模式 100 万行只要 3.4ms。
实测:64 位三种调用约定修饰无差别而 32 位是三态;-static 让 C++ exe 从 57KB 涨到 2.5MB 但 msvcrt.dll 仍动态;windres 加 code_page 资源小 8 字节。
实测:HKLM 64 位视图 71 个子键、32 位视图 56 个而写入时间一字不差;RegQueryValueExW 与 RegGetValue 对同一个值报差 10 倍的字节数;往 HKLM 写一律 rc=5。
实测:26 行源码预处理后变 2012 行(180 倍),-O2 把 .o 压成 1/42 而另一个小文件反而大 29%;四种报错署名分别对应哪个编译阶段。
实测:1 MiB 未初始化数组的 .o 只要 748 字节,strip 让 exe 从 97 KB 降到 52 KB;-fno-common 下未初始化全局变量从弱符号变强符号,链接直接报错。
数组就是一段连续内存,这句话能解释 C 里九成的数组 bug。地址实测、退化规则、\0 终止符、strncpy 的陷阱,以及越界访问为什么"看起来能用"。
C 的语法看着小,坑集中在三处:类型的真实宽度、混合运算的隐式转换、以及把"求值顺序"当成"优先级"。所有数字都在本机 MinGW GCC 13.1.0 上实测。