[英]Size of std::array, std::vector and raw array
让我们拥有
std::array <int,5> STDarr;
std::vector <int> VEC(5);
int RAWarr[5];
我试图把它们的大小
std::cout << sizeof(STDarr) + sizeof(int) * STDarr.max_size() << std::endl;
std::cout << sizeof(VEC) + sizeof(int) * VEC.capacity() << std::endl;
std::cout << sizeof(RAWarr) << std::endl;
输出是
40
20
40
这些计算正确吗? 考虑到我没有足够的内存来存储std::vector
,也没有逃避动态分配的方式,该怎么办? 如果我知道std::array
导致较低的内存需求,那么我可以更改程序以使数组成为静态。
这些数字是错误的。 而且,我也不认为它们代表了您所认为的。 让我解释。
首先,关于他们错的部分。 不幸的是,您没有显示sizeof(int)
的值,因此我们必须导出它。 在您使用的系统上,可以将int
的大小计算为
size_t sizeof_int = sizeof(RAWarr) / 5; // => sizeof(int) == 8
因为这实际上是sizeof(T)
的定义:它是数组中两个相邻的类型T
对象的开始之间的字节数。 这恰好与STDarr
的数字打印不一致 :类模板std::array<T, n>
被指定为其中嵌入了n
个类型为T
对象的数组。 此外, std::array<T, n>::max_size()
是一个常数表达式,产生n
。 也就是说,我们有:
40 // is identical to
sizeof(STDarr) + sizeof(int) * STDarr.max_size() // is bigger or equal to
sizeof(RAWarr) + sizeof_int * 5 // is identical to
40 + 40 // is identical to
80
那就是40 >= 80
一个矛盾。
同样,第二次计算也与第三次计算不一致: std::vector<int>
至少包含5
元素,并且capacity()
必须大于size()
。 此外, std::vector<int>
的大小不为零。 也就是说,必须始终满足以下条件:
sizeof(RAWarr) < sizeof(VEC) + sizeof(int) * VEC.capacity()
无论如何,所有这些都与您实际的问题似乎无关:使用内置的T
数组, std::array<T, n>
和an来表示n
个类型为T
对象的开销是多少? std::vector<T>
? 这个问题的答案是:
T[n]
使用sizeof(T) * n
。 std::array<T, n>
使用与T[n]
相同的大小。 std::vector<T>(n)
需要一些控制数据(大小,容量以及可能并且可能是分配器)加上至少'n * sizeof(T)'个字节来表示其实际数据。 它可能会选择也具有一个大于n
的capacity()
。 除了这些数字之外,实际上使用这些数据结构中的任何一个都可能需要附加的内存:
好的,我希望这能提供一些见识。 但是,这是一条重要信息:如果std::vector<T>
无法容纳您拥有的数据量,则有两种情况:
T[n]
或std::array<T, n>
的数据太多,将无济于事,因为我们正在谈论的开销通常小于32个字节。 也许您可以描述您实际要做什么,以及为什么不能选择std::vector<T>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.