我目前对严格别名规则背后的原理感到好奇。我知道在C语言中某些别名是不允许的,这是为了允许优化,但我很惊讶这是在标准定义时优先选择的解决方案,而不是跟踪类型转换。
因此,显然以下示例违反了严格别名规则:
uint64_t swap(uint64_t val)
{
uint64_t copy = val;
uint32_t *ptr = (uint32_t*)© // strict aliasing violation
uint32_t tmp = ptr[0];
ptr[0] = ptr[1];
ptr[1] = tmp;
return copy;
}
我可能错了,但据我所知,编译器应该可以完美而轻松地跟踪类型转换并避免对显式转换的类型进行优化(就像它在处理受影响的值调用时避免同类型指针的优化一样)。那么,我错过了哪些严格别名规则问题,使得编译器无法轻松地自动检测到可能的优化呢?
double
或long
,有严格对齐限制的系统需要将它们放在8字节边界上,否则你的进程可能会被类似SIGBUS
的东西杀死。这并不是严格别名问题,但它涉及到许多相同的根本问题。 - Andrew Henleuint64_t
根据定义几乎总是适合于uint32_t
的对齐方式,所以这里肯定不是问题。 - Antti Haapala -- Слава Україні