【问题标题】:Should I use __restrict on references?我应该在引用上使用 __restrict 吗?
【发布时间】:2012-10-02 05:15:31
【问题描述】:

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

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 应用?

【问题讨论】:

  • 这里比较 MSVC 和 GCC 有什么意义? __restrict 是一个厂商扩展,所以你必须遵守每个厂商的规则。

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


【解决方案1】:

C++ 不像 C99 那样有 restrict 的概念。

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

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

【讨论】:

  • 你能举个例子说明两个扩展名相同但对不同的编译器有不同的含义吗?
  • @RafaelSpring:当然。在 DS9K 编译器中,每个以双下划线开头的名称在每次编译运行期间都有不同的含义 :-)
【解决方案2】:

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

与其更改对指针的引用,不如完全避免restrict,而是使用分析器来查找热点,并且仅当它表明 C++ 严格别名规则未涵盖的此类别名占用大量 CPU 时是时候考虑更改一个对指针的特定引用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-23
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-10-10
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多