包含容器的容器的C 生长
C++ Growth of containers containing containers?
如果我有 std::vector<std::set<int>>
。如果您插入其能力,则向量将重新分配。如果您在向量内有另一种可重大类型的情况,则向量仅保留指向上述类型的指针?
特别想知道如果向量有任意类型,我想知道如何分配内存。
std::vector<int> a(10); //Size will be sizeof(int) * 10
std::vector<std::set<int>> b(10);
b[0] = {0, 0, 0, 0, 0, 0, 0, .... }; //Is b's size effected by the sets inside?
c 对象只能具有一个大小,但可能包括指数以任意尺寸的堆内存。因此,是的,容器对象本身通常包括指向堆内存的指针,并且可能不包括任何实际项目。(唯一的典型例外是字符串类型,有时具有"小字符串优化",允许字符串对象直接在对象中包含小字符串而无需分配堆内存。)
任何向量将自己分配"本身"的内存始终是sizeof(element_type) * vector.size()。
矢量只能为可见的编译时间可见的元素数据分配内存。它不在乎元素类完成的任何分配。
将矢量视为类固醇的阵列。像数组一样,向量由一个连续的内存块组成,所有元素的大小都相同。要使此要求充分说明,必须在编译时知道每个元素的大小。
想象一个std ::设置具有这些成员变量:
struct SomeSet
{
size_t size;
SomeMagicInternalType* data;
};
因此,无论在运行时如何分配data
,向量仅将每个元素的内存分配给 compile Time ::
sizeof(someset :: size) sizeof(someset :: data)
在32位机器上将是4 4。
考虑此示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
std::cout << sizeof(v) << "n";
std::cout << v.size() << "n";
v.push_back(3);
std::cout << sizeof(v) << "n";
std::cout << v.size() << "n";
}
确切的数字可能会有所不同,但我以输出为:
24
0
24
1
添加元素时,vector
的大小(大小=对象的大小)不会更改。set
也是如此,因此vector<set>
如果其元素之一添加或删除元素,则不需要重新分配。
一组不会将其元素存储为成员,否则具有不同数量元素的集合将是不同的类型。它们存储在堆上,因此不会直接导致set
的大小。
a std::vector<T>
保存类型T
的对象。调整大小时,它会根据需要复制或移动这些对象。std::vector<std::set<int>>
没有什么不同;它拥有类型std::set<int>
的对象。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- Visual C++GC接口如何启用它以及要包含哪个库
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 包含容器的容器的C 生长