如果得到正确的结果,__declspec(noalias)告诉编译器,作为参数传递的指针都没有别名。

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

换言之,如果我没有弄错的话,它完全等同于对指针类型的每个参数调用__restrict但是有没有一种方法可以在不改变所有函数调用的情况下实现呢理想情况下,我将用预处理器定义替换__declspec(noalias)

最佳答案

我认为您对noalias的解释不正确;这与在每个参数上指定__restrict不同在example you reference from MSDN中,这意味着abc不修改或引用(当前编译单元的)任何全局状态,但它们可以自由地彼此别名您还可以在每个节点上指定__restrict,以表示它们之间没有别名我不知道你为什么提到在这个场景中更改所有的函数调用;只要没有调用方别名参数,调用站点就不会有任何更改您应该检查所有调用,但除非您需要删除别名,否则它们不必更改具体来说,呼叫站点不需要__restrict
GCC中的唯一类似方法是在同一个源文件(具有兼容类型)中的任何全局指针变量声明上指定__restrict(或more commonly for GCC__restrict__)请参见关于文件范围限定指针的here当然,不能保证GCC的行为会有任何不同,因为restrict通常只在函数范围内被考虑微软显然引入了restrict来实现他们引入的特定优化。
长话短说,这里没有宏技巧(除了R提到的完全忽略GCC上的noalias之外)最好是将__declspec()添加到任何非别名指针参数和全局变量声明中。

07-24 09:22