strict aliasing(严格别名规则):编译器优化时的一条假设/规则,指不同类型的指针通常不会指向同一块内存(即不会“别名”同一对象),除少数例外(如 char* 可别名任何对象等)。在 C/C++ 中违反该规则往往会导致未定义行为,从而出现看似“莫名其妙”的错误,尤其在高优化级别下更明显。
/strɪkt ˈeɪliəsɪŋ/
Strict aliasing can make your program faster, but it can also hide bugs.
严格别名规则可以让程序更快,但也可能把 bug 隐藏起来。
When the optimizer assumes strict aliasing, reinterpreting a float* as an int* may produce undefined behavior and break only in release builds.
当优化器基于严格别名规则进行假设时,把 float* 重新解释为 int* 可能触发未定义行为,并且可能只在发布版(高优化)中出问题。
strict 意为“严格的”,来自拉丁语 strictus(拉紧、严格);aliasing 来自 alias(化名/别名),源于拉丁语短语 alias(“在别的情况下/以别的名称”)。在计算机领域里,aliasing 指“两个不同的名字(指针/引用)指向同一对象/内存位置”。合在一起,strict aliasing 就是“对内存别名关系的严格假设/限制”。
-fstrict-aliasing、优化假设以及常见踩坑模式。