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

Why can I store objects in array that differ in size?

本文关键字:数组 我可以 对象 存储 为什么      更新时间:2023-10-16

例如以下代码:

#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(大小不同)存储在一个数组中而不会产生任何负面影响?为什么最后两个地址与第一个地址有所不同?

我本来以为容器和containertwo直接位于数组容器中,而无需任何指针。

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

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

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

为什么最后两个地址与第一个地址有所不同?

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

相关文章: