我能以某种方式`__restrict__ this`吗?

Can I `__restrict__ this` somehow?

我一直在看 Mike Acton's talk on Data-oriented design in C++ 的 CppCon 2014,他举了这个例子:

int Foo::Bar(int count)
{
    int value = 0;
    for (int i = 0; i < count; i++) {
        if (m_someDataMemberOfFoo) value++
    }
    return value;
}

并解释了一些编译器如何在每次迭代中不断重新读取 m_someDataMemberOfFoo,这可能是因为它的值可能会因并发访问而改变。不管编译器这样做是否合适——是否可以告诉编译器在某些方法的执行过程中特别忽略任何并发访问任何东西的可能性,以便它可以更好地优化?

换句话说,我可以告诉编译器 this__restrict__ed 吗?

  1. __restrict__在C++中没有标准化,所以这个问题只能在特定的平台上回答。对于 GCC,您可以将 __restrict__ 应用于 this in the same way 作为 const:

    void T::fn () __restrict__
    
  2. 您的示例中没有潜在的别名。 C++ 指定数据竞争的未定义行为。

  3. 正在开发用于 C++ 受限指针的 new system。它可能会在 C++17 中标准化。支持 this 是规定的设计目标之一。

对于您发布的代码,使用任何优化编译的代码根本不应该重新读取该 class 成员。但是,采用类似的代码:

void Foo::Bar(int count, int* result)
{
    *result = 0;
    for (int i = 0; i < count; i++) {
        if (m_someDataMemberOfFoo) (*result)++;
    }
}

在这种情况下,如果该成员的类型为 int,则编译器必须假定结果 == &m_someDataMemberOfFoo 是可能的。显然,任何以这种方式调用它的开发人员都应该被吊销其编程许可证,但这是合法的,编译器必须正确处理。

如果您将方法标记为 "const",情况也是如此。 const 方法不允许使用 this 指针修改 *this 的任何部分(有一些例外)。但是,如果实际对象不是 const,*this 的成员可以通过其他方式合法修改。

C 中的

"restrict" 旨在解决该问题,希望 C++ 中的相同功能能够在这种情况下解决该问题。