Хранение ссылки на сам объект внутри функций-членов - PullRequest
0 голосов
/ 17 апреля 2019

Полезно ли с точки зрения экономии времени и сокращения количества операций создавать ссылку на (*this) в начале функции-члена, где использование this-> является повторным?Это то, что компиляторы (меня больше всего интересует gcc) уже оптимизируют для меня?Есть ли причины этого не делать?

Пример:

void A::checkBytes( const byte * dataChunk, uint32_t chunkSize )
{
    A & self = (*this);
    bool UTF8Valid = self.InvalidSequences & 1;
    byte current, expectedUTF8Bytes = 0;
    for (uint32_t i = 0; i < chunkSize; i++)
    {
        current = dataChunk[i];

        // many tests with 'current' and 'this->InvalidSequences'

        self.Count[current]++;
        self.ChunkSize++;
    }
    if (!UTF8Valid) self.InvalidSequences |= 1;
}

Я знаю, что каждая нестатическая функция-член имеет свою собственную скрытую this.Я знаю, что у меня будет и скрытый A * this, и A & self.Что я не знаю, так это то, что многие this->someMember будут стоить больше, чем многие referenceToThis.someMember, или не будут стоить вообще.

1 Ответ

5 голосов
/ 17 апреля 2019

Нет. в худшем случае он будет занимать дополнительное место в стеке и потребует дополнительных инструкций, в лучшем случае он оптимизируется обратно до this->.

this почти наверняка будет жить в регистре, где это возможно, а ссылка типа A& в основном является указателем на уровне реализации.

Вероятно, даже нет смысла пытаться сохранить прямой указатель / ссылку на this->Count и т. Д., Поскольку на большинстве платформ this->Count[n] может быть одной инструкцией (например, на x86, я думаю, LEA будет вы можете проверить разборку).

...