为什么我可以将对象存储在大小不同的数组中?

时间:2017-12-12 13:43:46

标签: c++ arrays memory-address

例如以下代码:

#include <iostream>
#include <vector>

class VectorContainer
{
public:
  VectorContainer(std::vector<int>::size_type sz)
  {
    foo.reserve(sz);
    for (int i = 0; i < sz; i++) {
        foo.push_back(i);
    }
  }

  std::vector<int> foo;
};


int main(int argc, const char * argv[]) {

  VectorContainer containerOne(0);

  VectorContainer containerTwo(1);

  std::cout << &containerOne << std::endl;

  std::cout << &containerTwo << std::endl;

  VectorContainer arr[2] = {containerOne, containerTwo};

  std::cout << &arr[0] << std::endl;

  std::cout << &arr[1] << std::endl;

  return 0;
}

产生以下输出:

0x7ffeefbff578
0x7ffeefbff560
0x7ffeefbff5e0
0x7ffeefbff5f8

为什么可以在一个数组中存储VectorContainers(大小不同)而没有任何负面影响?为什么最后两个地址与前两个地址不同?

我原以为containerOne和containerTwo直接位于数组容器中而没有任何指针。

1 个答案:

答案 0 :(得分:5)

  

为什么在这里可以将VectorContainers(大小不同)存储在一个数组中而没有任何负面影响?

因为每个VectorContainer对象具有相同的对象表示,所以使用相同数量的字节sizeof(VectorContainer),这基本上是sizeof(std::vector<>)。关键是向量本身将指针保存到实际上可以在大小上变化的不同内存区域。但由于此区域的大小不会影响指针的大小(因此也不会影响矢量对象的表示布局),因此可以将这些对象打包到公共数组中。

请注意,此技术基本上也是多态性的核心。

  

为什么最后两个地址与前两个地址不同?

因为它们与完全不同的物体有关。前两个是单独的对象,而后两个是初始化数组时从第一个复制的数组的一部分。