[英]C++ std::vector memory/allocation
根据先前关于载体容量的问题 ,贝利先生说:
在当前的C ++中,保证在调用保留之后不会发生重新分配,直到插入的大小超过上一次保留调用的值。 在呼叫保留之前,或者在保留呼叫之后,当大小介于上一次保留呼叫的值和容量之间时,如果允许,则允许实施提前重新分配。
所以,如果我理解正确,为了确保在超出容量之前不会重新分配,我必须保留两次? 你能澄清一下吗?
我正在使用vector作为这样的内存堆栈:
std::vector<double> memory;
memory.reserve(size);
memory.insert(memory.end(), matrix.data().begin(), matrix.data().end()); // smaller than size
memory.resize(memory.capacity(), 0);
我需要保证在上面不会发生重新分配。
谢谢。
ps:我还想知道是否有更好的方法以类似的方式管理内存堆栈而不是vector
我认为你读错了。 允许保留将capacity
设置为比您预留的capacity
更大的capacity
。 特殊语言是允许实现重新分配,如果您保留的次数超过上次,但在达到当前容量之前。
它需要更多时重新分配。 您不需要预留两次。 如果您正在进行大量插入并且您对存储的大小有很好的了解,那么使用reserve是个好主意。 它快得多。
你不应该两次打电话reserve
。
此外,在发布的代码示例中,您只调用了一次reserve
。 实际上,您粘贴的代码会影响向量的size
。 有关void resize(size_type sz, const T& c);
影响,请参见23.3.6.2.11(C ++ 0x FCD void resize(size_type sz, const T& c);
:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; // do nothing
所以,基本上,当你调用memory.resize(memory.capacity(), 0)
你是,实际上,附加上0
, memory.capacity() - memory.size()
倍的调用以下memory.insert
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.