我应该在引用上使用__restrict吗?

时间:2012-10-11 13:56:21

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

在我编写的程序中,我的一个函数声明是这样的:

bool parse( const sentence & __restrict sentence )
{
  // whatever
}

当我使用Microsoft Visual Studio 2010 Express编译代码时,编译器会抱怨:

  

警告C4227:使用的时间错误:引用的限定符被忽略

然而,GCC文件的this page说:

  

除了允许受限制的指针之外,您还可以指定受限制的引用,这些引用指示引用在本地上下文中没有别名。

同一页面给出了一个非常明确的例子:

 void fn (int *__restrict__ rptr, int &__restrict__ rref)
 {
   /* ... */
 }

我是否误解了MVSC的警告?或者我应该将所有引用转换为指针,以便__restrict适用?

2 个答案:

答案 0 :(得分:8)

C ++在C99方面没有restrict的概念。

但是,有几个编译器供应商为他们的C ++编译器提供扩展,他们称之为__restrict(请注意保留的名称!)。鉴于它们是扩展,它们的行为由编译器供应商决定。您必须阅读文档并分别找出每个编译器中此扩展的作用。

仅仅因为两个供应商选择了相同的名称并不意味着扩展有任何共同之处。

答案 1 :(得分:0)

大概是因为它以__ __restrict开头,是一个特定于实现的扩展,可以按照每个实现的需要运行。我想在这种情况下两个编译器都是正确的。

为什么不完全避免使用restrict,而是使用分析器来查找热点,而且只有当它显示C ++严格别名规则未涵盖的这种别名时我会考虑将一个特定的引用改为指针。