【发布时间】:2019-09-14 14:15:18
【问题描述】:
我知道出于优化原因,向量的大小可能不是内存中对象的实际大小。
例如,有时如果我使用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。
【问题讨论】:
-
您能否在edit 的问题中包含一个示例,说明初始化“固定”数量元素的向量 的含义?
-
如果你不需要push_back,...你为什么不使用std::array?
-
@1201ProgramAlarm 我想她在问向量的大小是否是元素的实际数量。理论上,他们认为在
O(1)保持插入和删除摊销复杂性是原来的两倍 -
FWIW 您可以使用
capacity()来验证已分配了多少。 -
我不认为标准对向量的容量施加任何限制,除了它必须是
>=的大小。这意味着答案将是特定于实现的,并且可能会在没有警告的情况下进行更改。