c++ - 在成员函数中保留对对象本身的引用
问题描述
在节省时间和减少操作数量方面,(*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 * this
和A & self
. 我不知道许多是否this->someMember
会比许多花费更多referenceToThis.someMember
或根本不花费。
解决方案
不,最坏的情况下它会消耗额外的堆栈空间并需要一些额外的指令,最好的情况下它会被优化回this->
.
this
几乎肯定会在可能的情况下存在于寄存器中,并且类似的引用A&
基本上是实现级别的指针。
尝试存储直接指针/引用等可能没有任何好处this->Count
,因为在大多数平台上this->Count[n]
可以是一条指令(例如,在 x86 上我相信LEA
会使用,你可以检查反汇编)。
推荐阅读
- python - 我不知道为什么我把它作为我的输出?
- python - 字母总是被检测为大写,即使它们是小写
- opengl - GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 尝试创建多重采样帧缓冲区
- python - 如何检查列表的每个字符是否在字符串中?
- javascript - 我可以获取所有文档,但无法在 Firestore 中检索单个文档
- kotlin - 在 kotlin 枚举中默认起始顺序为 0,我该如何更改它?
- reactjs - 等待调度完成以获取状态
- arrays - 我需要遍历一个数组并在某些条件下添加元素
- linux - 将 go 代码提升到 root 权限?最佳实践?
- java - 是否可以在不破坏 Java 的情况下向 Comparable 添加默认方法?