如果我正确地得到它,__declspec(noalias)
告诉编译器没有作为参数传递的指针是别名。
__declspec(noalias) void multiply(float * a, float * b, float * c)
{
...
}
换句话说,如果我没弄错的话,它完全等同于在指针类型的每个参数上调用__restrict
。但有没有办法在不改变所有函数调用的情况下完成它?理想情况下,我会用预处理器定义替换__declspec(noalias)
。
答案 0 :(得分:2)
我认为你错误地解释了noalias
;它与在每个参数上指定__restrict
不同。在example you reference from MSDN中,这意味着a
,b
和c
不会修改或引用任何全局状态(当前编译单元),但它们是免费的彼此别名。您也可以 在每个上指定__restrict
,以表明它们彼此不是别名。我不确定为什么你提到改变这个场景中的所有函数调用;只要没有调用者别名参数,调用站点就不会发生任何变化。您应查看所有呼叫,但除非您需要删除别名,否则无需更改。具体而言,呼叫站点需要__restrict
GCC中唯一的模拟是在同一源文件(兼容类型)中的任何全局指针变量声明中指定__restrict
(或more commonly for GCC,__restrict__
)。请参阅here关于文件范围restrict
- 限定指针。当然,不能保证GCC的行为会有所不同,因为restrict
通常仅在功能范围内被考虑。 Microsoft明确介绍noalias
以启用他们引入的特定优化。
长话短说,这里没有宏技巧(除了R提到的完全忽略GCC的__declspec()
)。您可以做的最好是将__restrict
添加到任何非别名指针参数和全局变量声明。
答案 1 :(得分:1)
只需#define __declspec(x)
(以空白定义)。省略noalias / restrict不会对正确程序的行为进行任何更改。它所做的只是为编译器创建额外的(通常是非常小的,使用当前的编译器技术)机会。