引用成员变量内存大小优化

时间:2018-04-22 13:51:04

标签: c++ c++11 reference c++17

我在使用类似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的性能损失?

0 个答案:

没有答案