让我们拥有,
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
导致内存需求降低,我可以更改程序以使数组静态。
答案 0 :(得分:4)
这些数字是错误的。而且,我认为它们不代表你认为它们所代表的东西。让我解释一下。
首先是关于他们错误的部分。遗憾的是,您没有显示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()
无论如何,所有这些与您的实际问题似乎无关:使用{{1}的内置数组表示n
类型的T
对象的开销是多少? },T
和std::array<T, n>
?这个问题的答案是:
std::vector<T>
使用T[n]
。sizeof(T) * n
使用与std::array<T, n>
相同的尺寸。T[n]
需要一些控制数据(大小,容量,可能和可能的分配器)加上至少'n * sizeof(T)'字节来表示其实际数据。它可能会选择std::vector<T>(n)
大于capacity()
。除了这些数字之外,实际使用这些数据结构中的任何一个都可能需要额外的内存:
好的,我希望这提供了一些见解。但是,此处出现重要消息:如果n
无法保存您拥有的数据量,则有两种情况:
std::vector<T>
或T[n]
将没有多大帮助,因为我们所讨论的开销通常少于32个字节。也许您可以描述您实际上要做的事情,以及为什么std::array<T, n>
不是一个选项。