类型限定符深入
更新时间:2026-10-01。配合 c-memory-barrier,这篇厘清三个最常被误解的关键字。
一、const
对编译器的只读约束,帮助诊断和放进只读段;不等于对象物理不可变(外部硬件/强转/其它指针都可能改),也不提供线程可见性。
二、volatile
禁止把访问缓存进寄存器、禁止合并/删除读写,适用于:MMIO 寄存器、信号处理标志、中断与主循环共享变量。但它不保证读写原子性、不建立 happens-before、不阻止 CPU 重排。
三、restrict
告诉编译器“通过该指针访问的对象不会与其它指针重叠”,使编译器敢重排/向量化(memcpy 比 memmove 快的原因之一)。承诺不成立则是 UB。

四、常见坑
- 用 volatile 当线程同步手段。
- 多线程共享变量漏 volatile/原子。
- restrict 承诺错误导致优化出错。
- const 指针强转修改。
小结
总结
const 是对编译器的只读承诺(便于诊断、放进 .rodata,但对象物理上仍可能被强转/硬件/别的指针修改,无线程可见性语义),volatile 强制每次真实访存、禁止缓存合并(MMIO、信号标志、中断共享变量必需,但不保证原子性、不建立 happens-before、不阻止重排),restrict 则向编译器承诺"指针间不别名"以解锁重排与向量化(承诺不成立即 UB)——三者契约互不可替代,尤其不能拿 volatile 当线程同步手段。