如果我理解正确,__declspec(noalias)
则告诉编译器作为参数传递的指针都没有别名。
__declspec(noalias) void multiply(float * a, float * b, float * c)
{
...
}
换一种说法,如果我没记错的话,它完全等同于调用__restrict
指针类型的每个参数。但是有没有办法在不改变所有函数调用的情况下做到这一点?理想情况下,我会用__declspec(noalias)
预处理器定义替换它。
如果我理解正确,__declspec(noalias)
则告诉编译器作为参数传递的指针都没有别名。
__declspec(noalias) void multiply(float * a, float * b, float * c)
{
...
}
换一种说法,如果我没记错的话,它完全等同于调用__restrict
指针类型的每个参数。但是有没有办法在不改变所有函数调用的情况下做到这一点?理想情况下,我会用__declspec(noalias)
预处理器定义替换它。
我认为您的解释noalias
不正确;它与__restrict
在每个参数上指定不同。在您从 MSDN 引用的示例中,这意味着a
、b
和c
不修改或引用任何全局状态(当前编译单元的),但它们可以自由地相互别名。您还可以在每一个上指定__restrict
以指示它们不相互别名。我不确定您为什么提到在这种情况下更改所有函数调用;只要没有调用者为参数设置别名,调用站点就不会发生任何变化。您应该查看所有调用,但它们不需要更改,除非您需要删除别名。具体来说,__restrict
不是在呼叫站点需要。
GCC 中唯一的类似物是在同一源文件(具有兼容类型)中的任何全局指针变量声明上指定__restrict
(或更常见的是 GCC) 。有关文件范围限定的指针,__restrict__
请参见此处。restrict
当然,不能保证 GCC 的行为会有所不同,因为restrict
通常只在函数范围内考虑。微软明确介绍noalias
了他们引入的特定优化。
长话短说,这里没有宏技巧(除了 R 提到的__declspec()
在 GCC 上完全忽略的技巧)。您可以做的最好的事情是添加__restrict
到任何非别名指针参数和全局变量声明中。
只是#define __declspec(x)
(对于一个空白的定义)。省略 noalias/restrict 不会改变正确程序的行为。它所做的只是为编译器创造额外的(通常是非常小的,使用当前的编译器技术)进行优化的机会。