在C中,标准内存处理函数是malloc()
,realloc()
和free()
.但是,C++ stdlib分配器只兼容其中两个:没有重新分配功能.当然,不可能完全相同realloc()
,因为简单地复制内存不适合非聚合类型.但是,这个函数是否会出现问题:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
Run Code Online (Sandbox Code Playgroud)
哪里
ptr
先前为num_now
对象分配了相同的分配器;num_requested
> = num_now
;和语义如下:
ptr
从给定num_now
对象的大小扩展给定的内存块num_requested
,它会这样做(留下额外的内存未初始化)并返回true
;false
.当然,这不是很简单,但据我所知,分配器主要用于容器和容器的代码通常很复杂.
给定这样的函数,std::vector
比如说,可以增长如下(伪代码):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one …
Run Code Online (Sandbox Code Playgroud) 有没有办法减少矢量的容量?
我的代码将值插入到向量中(事先不知道它们的数字),当这完成时,向量仅用于读取操作.
我想我可以创建一个新的向量,用大小做一个.reseve()并复制项目,但我真的不喜欢额外的复制操作.
PS:我不关心便携式解决方案,只要它适用于gcc.
在C++ 11 shrink_to_fit
是引入补充某些STL容器(例如,std::vector
,std::deque
,std::string
).
Synopsizing,其主要功能是请求与之关联的容器,以减少其容量以适应其大小.但是,此请求是非绑定的,并且容器实现可以自由地进行优化,并使向量的容量大于其大小.
此外,在之前的SO问题中,OP不鼓励使用它shrink_to_fit
来减小其容量std::vector
.不这样做的理由如下:
shrink_to_fit
什么都不做,或者它给你缓存局部性问题,并且执行O(n)(因为你必须将每个项目复制到他们新的较小的家庭).通常,将松弛留在内存中会更便宜.@Massa
有人可以如此善意地解决以下问题:
std::vector
).shrink_to_fit
?如果我使用resize()
和reserve()
在程序开始时将std :: vector分配给某个大小和容量,是否有pop_back()
可能"破坏"保留容量并导致重新分配?
它实际上是否保证以下减少容量技巧将"起作用"?
int main() {
std::string s = "lololololol";
s = ""; // capacity still non-zero
string(s).swap(s); // ?
}
Run Code Online (Sandbox Code Playgroud)
它对我来说似乎没有"起作用"(因为容量仍然不为零),而且我在标准中找不到任何东西,而不是"内容"必须在两者之间交换[这里,相同的]对象.
同样,对于序列容器:
int main() {
vector<int> v { 1,2,3,4,5 };
v.clear(); // capacity still non-zero
vector<int>(v).swap(v); // ?
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这个"技巧"是半广泛使用的; 也许这种广泛采用是错误的?
(当然,在C++ 11中,我们shrink_to_fit
[虽然没有绑定],但是这种做法没有实际意义.)
我不能很好地算出算法成本,所以我在这里问。
这是一个初始使用1000个元素初始化的向量:
vector<unsigned int> mFreeIndexes(1000);
Run Code Online (Sandbox Code Playgroud)
我将持续将pop_back / push_back元素添加到向量中,但绝不会将push_back超过1000个(因此绝不要强迫向量重新分配)。
在这种情况下,pop_back / push_back操作是O(1)还是O(n)?
我知道在向量上使用 push_back() 时,该向量可能会被重新分配(如果没有剩余空间)以获得更多空间。使用 pop_back() 时,是否可以重新分配向量,以释放未使用的空间?
一般来说,在使用 push_back() 和 pop_back() 操作序列时,我能否以某种方式确保我的向量不会被重新分配(假设我知道它的最大容量)?这种重新分配使我的指针和迭代器无效并导致问题。