Могу ли я как-то ограничить это?

Я смотрел Доклад Майка Актона о 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__ред?

1

Решение

  1. __restrict__ не стандартизирован в C ++, поэтому на этот вопрос можно ответить только на конкретной платформе. Для GCC вы можете подать заявку __restrict__ в this таким же образом как const:

    void T::fn () __restrict__
    
  2. В вашем примере нет потенциального псевдонима. C ++ определяет неопределенное поведение для гонок данных.

  3. новая система для C ++ ограниченные указатели находятся в стадии разработки. Скорее всего, это будет стандартизировано в C ++ 17. Поддержка для this является одной из заявленных целей дизайна.

4

Другие решения

С кодом, который вы разместили, код, скомпилированный с какой-либо оптимизацией, вообще не должен перечитывать этого члена класса. Однако возьмите этот похожий код:

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 ++ исправит ее в этом случае.

2

По вопросам рекламы [email protected]