1

我一直在看Mike Acton 在 CppCon 2014 上关于 C++ 中面向数据的设计的演讲,他举了这个例子:

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 的编译器吗?

4

2 回答 2

4
  1. __restrict__在 C++ 中没有标准化,所以这个问题只能在特定平台上回答。对于 GCC,您可以__restrict__按以下this 方式申请:const

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

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

于 2015-04-26T22:05:18.197 回答
2

使用您发布的代码,使用任何优化编译的代码都不应该重新读取该类成员。但是,使用这个类似的代码:

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

在这种情况下,编译器必须假设 result == &m_someDataMemberOfFoo 是可能的,如果该成员具有 int 类型。显然,任何以这种方式称呼它的开发人员都应该吊销他的编程许可证,但这是合法的,编译器必须正确处理。

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

C 中的“限制”旨在解决该问题,希望 C++ 中的相同功能可以在这种情况下解决它。

于 2015-04-26T22:22:20.490 回答