受限环境与 volatile
volatile 到底保证什么——两条反汇编指令说清;忙等待为什么会被整个删掉、没有堆怎么分配内存、栈预算怎么量,以及 -Os 比 -O2 小在哪。
volatile 到底保证什么——两条反汇编指令说清;忙等待为什么会被整个删掉、没有堆怎么分配内存、栈预算怎么量,以及 -Os 比 -O2 小在哪。
string.h 的长度语义、memcpy 与 memmove 在重叠时的真实差异、atoi 与 strtol 的分水岭、errno 什么时候能读,以及 RAND_MAX 只有 32767 这件事。
sizeof 为什么比你算的大、字段顺序值几字节、填充字节怎么让 memcmp 骗过你、位域和联合体的实现定义边界,以及柔性数组的正确用法。
同一份代码在 -O0 给出 2、-O2 给出 1——严格别名规则怎么让编译器生成"错"代码,以及有符号溢出和判空被删背后的同一套逻辑:编译器按假设优化,而不是按你的意图。
stdarg 的三条硬规则(类型靠约定、float 必按 double 读、va_copy 才能遍历两遍),复杂声明的读法口诀,以及 _Generic 为什么匹配不到 const char * 分支。
实测:同一个 SB 装配下,relaxed 的 120 万轮里有 54%–63% 出现 r1==0&&r2==0 的违例,把内存序换成 seq_cst 后两次各 120 万轮都是 0;seq_cst 存是 `xchg`(5.71ns),relaxed 存是 `mov`(0.26ns),而 `lock addq` 无论什么序都一个价;16 字节 atomic 在 MinGW 上不加 -latomic 直接链不过,加了之后 is_lock_free=0。
实测:判断写在锁外会真的永久卡死(看门狗 3 秒超时、CPU 采样 0);单条件变量配 notify_one 在小缓冲上死锁,同场景 notify_all 要 8.5 秒而双条件变量只要 1.6 秒;wait_for(10µs) 实际睡 15.1 毫秒。
实测:C++20 协程的 resume 只要 3.56 纳秒、帧 64 字节,创建+销毁 10 万个协程 15.6 毫秒;Win32 Fiber 每次切换 41 纳秒但每个协程实占 32172 字节——10 万个 Fiber 直接吃掉 3069.84 MB 提交内存,比协程多 412 倍;线程是 120.8 微秒创建 + 37 KB。