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

Mai*_*aik 1 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;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

0x7ffeefbff578
0x7ffeefbff560
0x7ffeefbff5e0
0x7ffeefbff5f8
Run Code Online (Sandbox Code Playgroud)

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

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

Jod*_*cus 5

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

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

请注意,这种技术基本上也是多态性的核心.

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

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