为什么我可以将对象存储在大小不同的数组中
Why can I store objects in array that differ in size?
例如以下代码:
#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 指针固定在实际上可能会变化的不同内存区域。但是,由于该区域的大小没有影响指针的大小(因此对向量对象的表示布局),因此您可以将这些对象包装到一个共同的数组中。
请注意,该技术基本上也是多态性的核心。
为什么最后两个地址与第一个地址有所不同?
因为它们与完全不同的对象相关。前两个是单独的对象,而最后两个是一个数组的一部分,该数组是从第一个数组中复制的,当您初始化数组时。
相关文章:
- 在二维向量或数组中可以存储的最大元素数是多少?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 确定数组是否可以旋转 3 个连续的数组元素进行排序?
- C++指针/数组(我现在完全困惑,真的需要帮助)
- 我将 c++ 矢量数据集转换为 c 数组.我将相同的数据集传递到一个应该给出相同输出的函数中
- 我在代码中收到一个运行时错误,该错误如何通过修改最多一个元素来查找数组是否可以变得不减少
- 下课时的数组是否可以正常工作?
- 为什么该函数不会获得动态数组?(我正在使用指针和参考)
- 指针到数组何时可以转换为不同类型的指针到数组?
- 确定数组是否可以划分为两个子序列,每个子序列的顺序递增
- 无符号整数数组怎么可以包含负整数
- 对象数组作为链表中的字符数组 - 我对对齐的假设是否有效
- 带有初始化的c++新数组我以前从未在采访中见过
- 如何正确地将std::字符串转换为无符号char[]数组*.我觉得我做错了,有人给我指明了正确的方向
- 数组元素可以具有标识符
- 在c++中,整数数组之间可以有空元素吗?
- (C++)正在尝试打印char*数组(我认为)
- C++对象实例化数组(我正在尝试找到编译时解决方案)
- 如何测试使用 MPI 调用的 CC++ 代码:是否有任何一组我可以使用的模拟函数
- 实现一个 dinamic 数组(我可以访问不存在的位置)