【发布时间】:2009-04-16 06:11:04
【问题描述】:
在 C 中,观察严格别名带来的性能优势究竟是什么?
【问题讨论】:
标签: c performance
在 C 中,观察严格别名带来的性能优势究竟是什么?
【问题讨论】:
标签: c performance
有一个页面非常彻底地描述了别名here。
总而言之,当两个不同类型的指针访问同一个位置时,编译器无法假定数据的值(即它必须每次都读取该值,因此无法进行优化)。
这仅在未强制执行严格别名时发生。严格的别名选项:
将此代码复制粘贴到 main.c:
void f(unsigned u)
{
unsigned short* const bad = (unsigned short*)&u;
}
int main(void)
{
f(5);
return 0;
}
然后使用这些选项编译代码:
gcc main.c -Wall -O2
你会得到:
main.c:3: 警告:取消引用类型双关语 指针将破坏严格混叠 规则
禁用别名:
gcc main.c -fno-strict-aliasing -墙 -O2
警告消失了。 (或者只是取出 -Wall 但是......没有它就不要编译)
尽我所能,我无法让 MSVC 给我一个警告。
【讨论】:
restrict 无法获得的性能优势,已经进行了多少研究?您的第一篇链接文章建议“如果程序需要-fno-strict-alias,则应该认为程序员可能不会费心使用restrict,但如果restrict 可以提供基于类型的别名的所有性能优势而没有语义限制,为什么不应该禁用基于类型的别名,特别是考虑到没有办法知道 gcc 对规则的解释将来会如何变化?