首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

VC的STL,vector/deque历次增长的因子是多少,源代码的什么地方能看到

2012-07-23 
VC的STL,vector/deque每次增长的因子是多少,源代码的什么地方能看到?例如,网上说,对于一个空的vector而言,

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:

C/C++ code
    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);        } 

热点排行