繁体   English   中英

std :: array,std :: vector和raw数组的大小

[英]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> 这个问题的答案是:

  1. 内置数组T[n]使用sizeof(T) * n
  2. std::array<T, n>使用与T[n]相同的大小。
  3. 一个std::vector<T>(n)需要一些控制数据(大小,容量以及可能并且可能是分配器)加上至少'n * sizeof(T)'个字节来表示其实际数据。 它可能会选择也具有一个大于ncapacity()

除了这些数字之外,实际上使用这些数据结构中的任何一个都可能需要附加的内存:

  1. 所有对象都在适当的地址对齐。 为此,对象前面可能有一个额外的字节。
  2. 当在堆上分配对象时,内存管理系统除了可以使用的内存外,还包括几个字节。 这可能只是大小的一个字,但无论分配机制如何,它都可以。 同样,此内存可能位于分配内存之外的其他位置,例如,在哈希表中。

好的,我希望这能提供一些见识。 但是,这是一条重要信息:如果std::vector<T>无法容纳您拥有的数据量,则有两种情况:

  1. 您的内存极低,因此大部分讨论都是徒劳的,因为您需要完全不同的方法来处理几个字节。 如果您在资源极其有限的嵌入式系统上工作,就会是这种情况。
  2. 使用T[n]std::array<T, n>的数据太多,将无济于事,因为我们正在谈论的开销通常小于32个字节。

也许您可以描述您实际要做什么,以及为什么不能选择std::vector<T>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM