如何在GCC上移植__declspec(noalias)

时间:2012-03-10 18:23:44

标签: c visual-c++ gcc alias restrict-qualifier

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

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

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

2 个答案:

答案 0 :(得分:2)

我认为你错误地解释了noalias;它与在每个参数上指定__restrict不同。在example you reference from MSDN中,这意味着abc不会修改或引用任何全局状态(当前编译单元),但它们是免费的彼此别名。您也可以 在每个上指定__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不会对正确程序的行为进行任何更改。它所做的只是为编译器创建额外的(通常是非常小的,使用当前的编译器技术)机会。