首页 > 解决方案 > 在成员函数中保留对对象本身的引用

问题描述

在节省时间和减少操作数量方面,(*this)在使用 of 的成员函数的开头创建引用是否有用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;
}

我知道每个非静态成员函数都有自己的 hidden this。我知道我会同时拥有隐藏A * thisA & self. 我不知道许多是否this->someMember会比许多花费更多referenceToThis.someMember或根本不花费。

标签: c++optimizationreferencethis

解决方案


不,最坏的情况下它会消耗额外的堆栈空间并需要一些额外的指令,最好的情况下它会被优化回this->.

this几乎肯定会在可能的情况下存在于寄存器中,并且类似的引用A&基本上是实现级别的指针。

尝试存储直接指针/引用等可能没有任何好处this->Count,因为在大多数平台上this->Count[n]可以是一条指令(例如,在 x86 上我相信LEA会使用,你可以检查反汇编)。


推荐阅读