【发布时间】:2015-07-05 05:05:52
【问题描述】:
我在 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__ed 吗?
【问题讨论】:
-
任何名副其实的编译器都会考虑将检查提升到循环之外,或者至少将
m_someDataMemberOfFoo保存在寄存器中。任何尝试与此代码同时修改m_someDataMemberOfFoo的程序都会表现出未定义的行为。 -
@IgorTandetnik:不一定。这是一个不合理的语义假设。也许
m_someDataMemberOfFoo应该通过并发修改来改变? -
我觉得这个假设在上下文中是合理的。如果
m_someDataMemberOfFoo是线程安全的(比如atomic),并且预计它会被同时修改,那么整个问题就没有实际意义了。 “some 编译器在每次迭代中不断重新读取m_someDataMemberOfFoo”并不是这种情况——所有编译器都会这样做,这将是完全有效和合理的——实际上,是必需的——他们这样做。
标签: c++ optimization concurrency restrict restrict-qualifier