VC的STL,vector/deque每次增长的因子是多少,源代码的什么地方能看到?
例如,网上说,对于一个空的vector而言,不断的push_back会触发内存的分配(resize-->realloc()),
我想知道,对于VC的实现而言,每次resize的时候vector变大的比例是多少,例如1.5倍,2倍,4倍等。
这个我在源代码里面搜索了一会儿没有找到啊,在哪里?
deque空间不够的时候,每次分配的chunk又是多大呢,在源码的什么地方能看见?
[解决办法]
举例来说,我用的是VS2008自带的STL,在push_back的时候,首先判断
if (size() < capacity())
可以看出,size函数是_Mylast - _Myfirst
capacity函数是_Myend - _Myfirst
所以,分配内存的时候,估计要改动_Myend,因此,在这个变量上增加一个数据断点
就能看到分配内存的地方了。
个人猜测。
[解决办法]
额 增加的因子记得好像是1.5
[解决办法]
应该是这行语句。
_Capacity = max_size() - _Capacity / 2 < _Capacity
? 0 : _Capacity + _Capacity / 2;// try to grow by 50%
[解决办法]
一般的实现是如果capacity不足以存放将要放入的元素,那么试图扩允50%.(在源码的 vector头文件中可以看到,具体参考push_back函数)
[解决办法]
先
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮
再参考
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cliext\vector
line 548..579:
size_type _Insert_space(size_type _Where, size_type _Count) { // dig a hole for _Count elements at _Where size_type _Capacity = capacity(); if (_Where < 0 || size() < _Where || _Count < 0 || _Maxsize - size() < _Count) throw gcnew System::ArgumentOutOfRangeException(); else if (_Capacity < size() + _Count) { // not enough room, reallocate _Myarray_t^ _Oldarray = _Myarray; _Capacity = _Maxsize - _Capacity < _Capacity ? 0 : 2 * _Capacity; // try to double capacity if (_Capacity < size() + _Count) _Capacity = size() + _Count; _Myarray = gcnew _Myarray_t(_Capacity); _Copy(_Oldarray, 0, _Where, 0); _Mysize = _Copy(_Oldarray, _Where, _Mysize, _Where + _Count); } else if (size() - _Where < _Count) _Mysize = _Copy(_Myarray, _Where, size(), _Where + _Count); // new stuff spills off end else { // new stuff can all be assigned size_type _Oldend = size(); _Mysize = _Copy(_Myarray, _Oldend - _Count, _Oldend, _Oldend); _Copyback(_Where, _Oldend - _Count, _Oldend); } return (_Where); }