8

在我正在编码的程序中,我的一个函数声明如下所示:

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

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

警告 C4227:使用不合时宜:忽略引用的限定符

但是,GCC 文档的这一页说:

除了允许使用受限指针之外,您还可以指定受限引用,这表明该引用在本地上下文中没有别名。

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

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

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

4

2 回答 2

8

C++ has no notion of restrict in the way C99 does.

However, several compiler vendors offer extensions to their C++ compilers, which they call __restrict (note the reserved name!). Given that those are extensions, their behaviour is determined by the com­pi­ler vendor. You will have to read the documentation and find out what this extension does in each com­pi­ler separately.

Just because two vendors chose the same name doesn't mean the extensions have anything in common.

于 2012-10-11T14:20:13.730 回答
1

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

与其更改对指针的引用,为什么不restrict完全避免,而是使用分析器来查找热点,并且只有当它表明 C++ 严格别名规则未涵盖的这种别名占用大量 CPU 时间时,我才会考虑更改一个对指针的具体引用。

于 2012-10-11T14:01:46.590 回答