"fixed"大小的向量在 c++ 中也可以具有假大小(与内存大小相比)吗
Can a vector of a "fixed" size also have a false size (compared to memory size) in c++
我知道出于优化原因,向量的大小可能不是内存中对象的实际大小。 例如,有时如果我使用push_back
或resize
,内存中的向量实际上将容纳两倍数量的元素的大小。
我读到,如果我从矢量中推送或弹出元素,或者使用调整大小,情况就是如此,即使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 字节内存的人设计的(,但没有理由让实现预先分配超过该空间的空间,而且我不知道有任何这样的保证。
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 为什么即使直到最后才定义实际类型,也可以将依赖名称视为完整
- 斯塔克,堆栈,也可以在底部和顶部添加整数
- 重塑Microsoft的并发::d iagnostic::span,也可以检测外部跨度
- 在不工作的情况下为数组分配指针,但反过来也可以
- 本地分配的内存是否可以用于将来使用?
- "fixed"大小的向量在 c++ 中也可以具有假大小(与内存大小相比)吗
- 为什么共享内存(在IPC中)不需要上下文切换?这是内核空间的内存,可以映射到用户空间
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 由于删除对象而导致的 Cpp 代码主线程冻结可以使用智能指针解决,也可以不使用智能指针来解决
- 即使在同一类型上,也可以将击曲线调用新的位置
- 除了两个构造函数外,C++库导入也可以工作
- 张量类,它有自己的存储,但也可以映射外部指针
- 如何将模板类型转换为字符串(如果它也可以是字符串)
- 在C 中的功能可以返回某物,也可以返回任何东西
- 也可以将特征用于1-矢量(标量)
- 即使使用 malloc,两个字符 * 也可以具有相同的内存地址吗?
- 是否也可以在数组中动态删除内存?