2010-05-03 100 views
1

a previous question about vector capacity,贝利先生说:C++的std :: vector的内存/分配

在当前的C++可以保证不发生重新分配后的呼叫保留,直到插入将采取大小超出值之前的预留通话。在保留呼叫之前,或者在呼叫保留时,如果大小介于之前保留的呼叫的值和容量之间,则允许实施尽早重新分配。

因此,如果我理解正确,为了确保在容量超过之前不会发生重新分配,我必须做两次储备?你能澄清一下吗?

我使用矢量作为这样的存储栈:

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:我也想知道是否有比矢量

回答

4

我想你是在读错误的说法。允许储备将capacity设置为比您保留的金额更大的金额。如果您要保留的数量比您上次更多,但尚未达到当前容量,则使用特殊语言可以重新分配实施。

+0

好的,谢谢。 我不是说英语的人,那句话对我来说有点困惑 – Anycorn 2010-05-03 22:20:52

+0

@Mark,我觉得这个条目不太清楚。 C++的0 23.3.6.2.2 FCD更清晰:作用:一个指令,通知向量计划的更改大小,以便它可以相应地管理存储分配。在reserve()之后,如果 重新分配发生,capacity()大于或等于reserve的参数;并等于先前的capacity()的值,否则。当且仅当当前容量小于reserve()的参数时,此时重新分配 。如果除非通过非CopyConstructible类型的移动构造函数引发异常 ,则不会有效果。 – 2010-05-03 23:31:31

0

它重新分配时,它需要更多的其他类似的方式来管理内存堆栈一个更好的办法。你不需要预留两次。如果您正在进行大量插入,并且您对所存储内容的大小有充分的了解,那么使用预留是个不错的主意。它快得多。

0

您不需要拨打reserve两次。

此外,在发布的代码示例中,您只需调用reserve一次。实际上,您正在粘贴的代码会影响矢量的size。见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

+0

这是intent.I需要一些零内存 – Anycorn 2010-05-04 01:13:33