在成员函数中保留对对象本身的引用

时间:2019-04-17 10:37:41

标签: c++ optimization reference this

在节省时间和减少操作数量方面,在经常使用(*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 * thisA & self。我不知道很多this->someMember的价格是否会比很多referenceToThis.someMember的价格高。

1 个答案:

答案 0 :(得分:5)

不。最坏的情况是它会占用额外的堆栈空间并需要一些额外的指令,最理想的情况是它会被优化回this->

this几乎肯定会存在于寄存器中,并且像A&这样的引用基本上是实现级别的指针。

尝试存储指向this->Count等的直接指针/引用可能甚至没有收益,因为在大多数平台上this->Count[n]可以是一条指令(例如,在x86上,我相信{将使用{1}},您可以检查反汇编的内容。