如何在GCC上移植declspec(noalias)

如何在GCC上移植declspec(noalias),c,visual-c++,gcc,alias,restrict-qualifier,C,Visual C++,Gcc,Alias,Restrict Qualifier,如果我理解正确,\uu declspec(noalias)会告诉编译器作为参数传递的指针没有别名 __declspec(noalias) void multiply(float * a, float * b, float * c) { ... } 换言之,如果我没有弄错的话,它完全等同于对指针类型的每个参数调用\u restrict。但是有没有一种不改变所有函数调用的方法呢?理想情况下,我会用预处理器定义替换\uu declspec(noalias)。只是\define\uu decl

如果我理解正确,
\uu declspec(noalias)
会告诉编译器作为参数传递的指针没有别名

__declspec(noalias) void multiply(float * a, float * b, float * c)
{
    ...
}

换言之,如果我没有弄错的话,它完全等同于对指针类型的每个参数调用
\u restrict
。但是有没有一种不改变所有函数调用的方法呢?理想情况下,我会用预处理器定义替换
\uu declspec(noalias)

只是
\define\uu declspec(x)
(一个空白定义)。省略noalias/restrict不会改变正确程序的行为。它所做的只是为编译器创造额外的优化机会(通常非常小,使用当前的编译器技术)。

我认为您对noalias的解释不正确;这与在每个参数上指定
\u restrict
不同。在中,这意味着
a
b
c
不修改或引用任何全局状态(当前编译单元),但它们可以自由地相互别名。您还可以在每一个上指定
\u restrict
,以指示它们之间没有别名。我不知道你为什么提到在这个场景中更改所有函数调用;只要没有调用方为参数添加别名,调用站点就不会发生任何更改。您应该查看所有调用,但它们不需要更改,除非您需要删除别名。具体而言,呼叫站点不需要
\u restrict

GCC中唯一的类似方法是在同一源文件(兼容类型)中的任何全局指针变量声明上指定
\uuuuu restrict
(或,
\uuuuuuuu restrict
)。请参阅关于文件范围
限制
-限定指针。当然,不能保证GCC的行为会有所不同,因为
restrict
通常只在函数范围内考虑。微软明确引入了
noalias
,以实现他们引入的特定优化


长话短说,这里没有宏技巧(除了R提到的完全在GCC上忽略
\uu declspec()
)。您最好将
\uu restrict
添加到任何无别名指针参数和全局变量声明中。

+1用于此想法,但我不能接受此解决方案。上下文是视频游戏,
\u restrict
不是一个选项:)您是否测量了Windows上有无“noalias”的性能差异?过早优化是万恶之源。你在寻找这个问题的解决方案上所浪费的时间,可能最好是花在优化代码中更高层次的低效性上……在这一点上,我完全同意你的观点。但即使优化在我的情况下毫无意义,我可以想象未来的读者会真的需要一个解决方案。谢谢澄清!区别现在更为明显