Я наблюдал Mike Acton's talk on Data-oriented design in C++ в CppCon 2014, и он дает этот пример:Могу ли я «__restrict__ это» каким-то образом?
int Foo::Bar(int count)
{
int value = 0;
for (int i = 0; i < count; i++) {
if (m_someDataMemberOfFoo) value++
}
return value;
}
И объясняет, как некоторые компиляторы держать перечитывая m_someDataMemberOfFoo
в каждой итерации, возможно, потому, что его значение может измениться из-за одновременный доступ. Независимо от того, подходит ли компилятору это сделать - можно ли сказать компилятору специально игнорировать любую возможность одновременного доступа ко всему во время выполнения какого-либо метода, чтобы он мог оптимизировать лучше?
Другими словами, могу ли я сообщить ему компилятор, что this
is __restrict__
ed?
Любой компилятор, достойный имени, рассмотрит возможность поднятия проверки цикла или, по крайней мере, сохранение 'm_someDataMemberOfFoo' в регистре. Любая программа, которая пытается изменить «m_someDataMemberOfFoo» одновременно с этим кодом, обнаруживает неопределенное поведение. –
@IgorTandetnik: Не обязательно. Это делает необоснованное семантическое предположение. Может быть, 'm_someDataMemberOfFoo' должен изменяться путем одновременной модификации? – einpoklum
Я считаю, что предположение оправдано в контексте. Если 'm_someDataMemberOfFoo' потокобезопасно (скажем,' atomic'), и ожидается, что он будет одновременно изменен, то весь вопрос спорный. Не было бы так, чтобы компиляторы «* some * продолжали перечитывать« m_someDataMemberOfFoo »на каждой итерации» - все компиляторы будут делать это, и для них было бы совершенно разумно и разумно - действительно, потребовалось бы - для этого. –