我在使用类似STL的迭代器实现集合的家庭作业中遇到了一些有趣的问题。这是最小的例子:
class const_iterator {
public:
const int* const_p = new int();
const int& operator*()
{
return *const_p;
}
};
class iterator : public const_iterator
{
public:
int*& p = const_cast<int*&>(const_iterator::const_p);
int& operator*()
{
return *p;
//return const_cast<int&>(*const_iterator::const_p); //-alt solution, no reference member
}
};
据我所知,引用是一种&#34;语法糖&#34;对于程序员来说 - 他们就像&#34;别名&#34;一样,在必要时不占用内存,并进行优化。但是,运行sizeof()
结果是基类需要4个字节,派生迭代器需要8个字节。
摆弄更多,我发现引用成员总是占用4个字节。即使 - 在这种情况下 - 它们直接指向基类的成员。我没有看到为什么编译器会将它们作为指针保存在这里的原因?如果我们可以访问此引用,我们可以访问它所引用的对象吗?
此外,在函数范围中声明为局部变量的引用也在反汇编中添加了附加指令 - 显然在没有任何优化的情况下检查并且包括所有调试符号。那些在Release版本中被优化了吗?
int main() {
auto& amIAnAliasOrDoIExist(Long::Qualified::Very<Nasty>.Name);
return amIAnAliasOrDoIExist;
}
引用是否是纯粹的别名&#34; (在堆栈/堆中没有内存)?在什么情况下编译器可以这样的方式优化引用变量?标准对此有什么看法?
另外,由于声明这样的引用成员浪费了空间(在我的作业中),在每次调用operator *()时是否有使用const_casts的性能损失?