3

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

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

换一种说法,如果我没记错的话,它完全等同于调用__restrict指针类型的每个参数。但是有没有办法在不改变所有函数调用的情况下做到这一点?理想情况下,我会用__declspec(noalias)预处理器定义替换它。

4

2 回答 2

4

我认为您的解释noalias不正确;它与__restrict在每个参数上指定不同。在您从 MSDN 引用的示例中,这意味着abc不修改或引用任何全局状态(当前编译单元的),但它们可以自由地相互别名。您可以在每一个上指定__restrict以指示它们不相互别名。我不确定您为什么提到在这种情况下更改所有函数调用;只要没有调用者为参数设置别名,调用站点就不会发生任何变化。您应该查看所有调用,但它们不需要更改,除非您需要删除别名。具体来说__restrict不是在呼叫站点需要。

GCC 中唯一的类似物是在同一源文件(具有兼容类型)中的任何全局指针变量声明上指定__restrict(或更常见的是 GCC) 。有关文件范围限定的指针,__restrict__请参见此处。restrict当然,不能保证 GCC 的行为会有所不同,因为restrict通常只在函数范围内考虑。微软明确介绍noalias了他们引入的特定优化。

长话短说,这里没有宏技巧(除了 R 提到的__declspec()在 GCC 上完全忽略的技巧)。您可以做的最好的事情是添加__restrict到任何非别名指针参数和全局变量声明中。

于 2013-12-17T00:21:11.687 回答
-1

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

于 2012-03-10T21:12:23.147 回答