Alias 的定义
一个指针叫做另一个指针的 alias (别名)如果这两个指针都指向相同的地址或对象。
在C99标准里,建立一个与原类型不同的别名是非法的。这叫做 strict aliasing规则。这条规则在GCC的-O2级别以会自动使能。
strict alias 的好处
便于更进一步的优化。 这是一个例子:
typedef struct
{
uint16_t a;
uint16_t b;
uint16_t c;
}sample;
void
test (uint32_t * values, sample* uniform, uint64_t count)
{
uint64_t i;
for (i = 0; i < count; i++)
{
values[i] += (uint32_t)uniform->b;
}
}
如果不加-fstrict-aliasing,(在针对某些CPU的GCC里)uniform->b的循环里
每次都要被load,因为GCC此时比较保守,它怕values和uniform->b 指向相同的
地址,values更新了,会造成 uniform->b 的变化。但事实上这种情况很少发
生,如果我们能肯定uniform->b 与 values 指向的是不同的地方,就可以把
uniform->b提到循环的外面来。这就是 -fstrict-aliasing 的作用。
什么情况下会造成加了 -fstrict-aliasing 之后出现错误?
如果大量使用类型转换,就可能引起问题。如果现有代码里有大量类型转换,为了避免问题,
还是用 -fno-strict-aliasing 比较安全。新写的代码,尽可能与新标准靠拢,用
-fstrict-aliasing 能充分享受优化带来的好处。