Я смотрел Доклад Майка Актона о Data-ориентированном дизайне в 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__
ред?
__restrict__
не стандартизирован в C ++, поэтому на этот вопрос можно ответить только на конкретной платформе. Для GCC вы можете подать заявку __restrict__
в this
таким же образом как const
:
void T::fn () __restrict__
В вашем примере нет потенциального псевдонима. C ++ определяет неопределенное поведение для гонок данных.
новая система для C ++ ограниченные указатели находятся в стадии разработки. Скорее всего, это будет стандартизировано в C ++ 17. Поддержка для this
является одной из заявленных целей дизайна.
С кодом, который вы разместили, код, скомпилированный с какой-либо оптимизацией, вообще не должен перечитывать этого члена класса. Однако возьмите этот похожий код:
void Foo::Bar(int count, int* result)
{
*result = 0;
for (int i = 0; i < count; i++) {
if (m_someDataMemberOfFoo) (*result)++;
}
}
В этом случае компилятор должен предположить, что результат == &m_someDataMemberOfFoo возможен, если этот член имеет тип int. Очевидно, что любой разработчик, называющий это способом, заслуживает того, чтобы отозвать свою лицензию на программирование, но это законно, и компилятор должен обрабатывать это правильно.
Это даже в том случае, если вы помечаете метод как «const». Метод const не позволяет изменять какую-либо часть * this с помощью указателя this (с некоторыми исключениями). Однако члены * могут быть юридически изменены другими способами, если фактический объект не является const.
«restrict» в C предназначен для решения проблемы, и, надеюсь, та же функция в C ++ исправит ее в этом случае.