"fixed"大小的向量在 c++ 中也可以具有假大小(与内存大小相比)吗

Can a vector of a "fixed" size also have a false size (compared to memory size) in c++

本文关键字:内存 也可以 向量 fixed c++      更新时间:2023-10-16

我知道出于优化原因,向量的大小可能不是内存中对象的实际大小。 例如,有时如果我使用push_backresize,内存中的向量实际上将容纳两倍数量的元素的大小。

我读到,如果我从矢量中推送或弹出元素,或者使用调整大小,情况就是如此,即使shrink_to_fit并不总是使矢量达到所需的大小。

如果我不使用所有这些,情况是否相同?我只是初始化一个"固定"数量的元素向量,并且从不使用它们。 我可以假设如果我初始化大小为 16 的向量,它会在内存中取出 16 * 大小的元素吗?

谢谢。

编辑:

我需要矢量用于其他用途。主要问题是我需要使用特定数量的内存。我可以使用数组,但它会不太方便。我试图将一行的实现理解为:

std::vector<X> myVec(16);

正如我所说,我读到如果我使用推送和弹出或调整大小,操作系统(我认为(可以分配比我指定的更多的空间。 但是我找不到任何关于我写的台词的说法。

谢谢 2 :)

编辑2:

有趣的发现:

{ 
vector<int> a(16);
vector<int> b(32);
vector<int> c(32);
cout << a.capacity(); // prints 16
cout << b.capacity(); // prints 32
b = a;  // uses vector copy "="
cout << b.capacity(); // prints 32 (!!)

cout << c.capacity(); // prints 32
c = vector<int>(16)  // uses vector move "="
cout << c.capacity(); // prints 16 (!!)}

在阅读了有关向量中移动和复制构造函数的实现后,我尝试了这个。

因此,当使用右值(即移动构造函数(时,它似乎分配了指定的大小。但是,当使用复制赋值(或使用复制构造函数(时,它不会释放内存,并且向量的容量仍为 32。

标准在使用您使用的构造函数构造时不讨论初始capacity,也不讨论任何其他构造函数:

26.3.11.2 向量构造函数、复制和赋值 [vector.cons]

显式向量(size_type n, const Allocator&= Allocator(((; 效果:使用 n 个默认插入的元素构造一个向量 指定的分配器。 要求:T 应为默认可插入到 *这。 复杂度:以 n 为单位为线性。

也就是说,结果取决于实现(因此请检查您的编译器(。

另一方面,您提到的任何功能都不能保证capacity的变化符合您的期望/期望。

看起来你正在寻找boost::static_vector.它以固定容量初始化,在允许推送和弹出元素时永远不会超过它。一种boost::array但跟踪存储的项目数量。

这就是.reserve()的用途。它会将容量设置为您要求的任何容量,即使您尚未全部使用。如果您尝试push_back过去,您仍然会获得重新分配。

或者,首先创建 16 个元素,并在需要时使用任意数量的元素。虽然没有标准的保证(向量不是为担心 16 字节内存的人设计的(,但没有理由让实现预先分配超过该空间的空间,而且我不知道有任何这样的保证。

相关文章: