strict alias 的含义

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 能充分享受优化带来的好处。

你可能感兴趣的:(c,c,gcc,gcc)