gpt4 book ai didi

c++ - std::array、std::vector 和原始数组的大小

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:47 26 4
gpt4 key购买 nike

让我们有,

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()

无论如何,所有这些与您的实际问题几乎无关:代表 n 的开销是多少? T 类型的对象使用内置数组 T , 一个 std::array<T, n> , 和一个 std::vector<T> ?这个问题的答案是:

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

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

  1. 所有对象都在适当的地址对齐。为此,对象前面可能有额外的字节。
  2. 当在堆上分配对象时,内存管理系统除了可用内存之外还包括几个字节。这可能只是一个与大小有关的词,但它可能是分配机制想要的任何东西。此外,该内存可能存在于分配内存之外的其他地方,例如在某处的哈希表中。

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

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

也许您可以描述您实际尝试做的事情以及原因 std::vector<T>不是一个选项。

关于c++ - std::array、std::vector 和原始数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com