我在CppCon 2014中一直在关注Mike Acton's talk on Data-oriented design in 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__
编辑的吗?
答案 0 :(得分:4)
__restrict__
在C ++中没有标准化,所以这个问题只能在特定平台上回答。对于GCC,您可以将__restrict__
应用于this
in the same way作为const
:
void T::fn () __restrict__
您的示例中没有潜在的别名。 C ++为数据争用指定了未定义的行为。
正在开发用于C ++限制指针的new system。它很可能在C ++ 17中标准化。对this
的支持是所述设计目标之一。
答案 1 :(得分:2)
使用您发布的代码,使用任何优化编译的代码都不应该重新读取该类成员。但是,请使用类似的代码:
void Foo::Bar(int count, int* result)
{
*result = 0;
for (int i = 0; i < count; i++) {
if (m_someDataMemberOfFoo) (*result)++;
}
}
在这种情况下,编译器必须假设结果==&amp; m_someDataMemberOfFoo是可能的,如果该成员具有int类型。显然,任何开发人员都称之为取消编程许可证的方式,但这是合法的,编译器必须正确处理。
如果将方法标记为“const”,情况就是如此。不允许const方法通过使用this指针修改* this的任何部分(有一些例外)。但是,如果实际对象不是const,则可以通过其他方式合法修改* this的成员。
C中的“restrict”旨在解决问题,希望C ++中的相同功能可以解决这个问题。