C++隨筆 之 STL[vector]的存儲技術(原創)
首先我們先來看Example Code:
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
void main()
{
?vector<int> v;
//?cout<<v.allocator;
?v.push_back(0);
?v.push_back(1);
?v.push_back(2);
?v.push_back(3);
?v.push_back(4);
?v.push_back(5);
?cout<<v.max_size();
}
利用VC6.0的內存調試
?v.push_back(0);之后
//_First迭代器00481B40
//_Last迭代器00481B44
//_End迭代器004B1B44
?v.push_back(1);之后
//_First迭代器00481B00
//_Last迭代器00481B08
//_End迭代器004B1B08
為什么在執行一次push_back之后,迭代器全部會變呢?
下面我們看看P.J. Plauger的代碼
?void insert(iterator _P, size_type _M, const _Ty& _X)
??{if (_End - _Last < _M)
???{size_type _N = size() + (_M < size() ? size() : _M);
???iterator _S = allocator.allocate(_N, (void *)0);
???iterator _Q = _Ucopy(_First, _P, _S);
???_Ufill(_Q, _M, _X);
???_Ucopy(_P, _Last, _Q + _M);
???_Destroy(_First, _Last);
???allocator.deallocate(_First, _End - _First);
???_End = _S + _N;
???_Last = _S + size() + _M;
???_First = _S; }
??else if (_Last - _P < _M)
???{_Ucopy(_P, _Last, _P + _M);
???_Ufill(_Last, _M - (_Last - _P), _X);
???fill(_P, _Last, _X);
???_Last += _M; }
??else if (0 < _M)
???{_Ucopy(_Last - _M, _Last, _Last);
???copy_backward(_P, _Last - _M, _Last);
???fill(_P, _P + _M, _X);
???_Last += _M; }}
其中M = 1;
當_End - _Last < _M時,就要重新分配內存了,哦原來時這樣的.
[個人認為,在方便調試的時候,可以把C:\MSDEV\VC98\Include\下面的vector文件中的protected改成public:]
下面我給出在5次插入之后其內存分配
push_back(2)
//00481AC0
//00481ACC
//00481AD0
push_back(3);
//00481AC0
//00481AD0
//00481AD0
push_back(4);
//00481B20
//00481B34
//00481B40
push_back(5);
//00481B20
//00481B38
//00481B40
注意沒有,_Last - _First之后的明顯是size() * 4
[注:在VC6.0的STL版本是采用的PJSTL版本,是一種公認最垃圾的STL版本
在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司
在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我認為在可讀性,可移植性方面最好的一個版本]
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
void main()
{
?vector<int> v;
//?cout<<v.allocator;
?v.push_back(0);
?v.push_back(1);
?v.push_back(2);
?v.push_back(3);
?v.push_back(4);
?v.push_back(5);
?cout<<v.max_size();
}
利用VC6.0的內存調試
?v.push_back(0);之后
//_First迭代器00481B40
//_Last迭代器00481B44
//_End迭代器004B1B44
?v.push_back(1);之后
//_First迭代器00481B00
//_Last迭代器00481B08
//_End迭代器004B1B08
為什么在執行一次push_back之后,迭代器全部會變呢?
下面我們看看P.J. Plauger的代碼
?void insert(iterator _P, size_type _M, const _Ty& _X)
??{if (_End - _Last < _M)
???{size_type _N = size() + (_M < size() ? size() : _M);
???iterator _S = allocator.allocate(_N, (void *)0);
???iterator _Q = _Ucopy(_First, _P, _S);
???_Ufill(_Q, _M, _X);
???_Ucopy(_P, _Last, _Q + _M);
???_Destroy(_First, _Last);
???allocator.deallocate(_First, _End - _First);
???_End = _S + _N;
???_Last = _S + size() + _M;
???_First = _S; }
??else if (_Last - _P < _M)
???{_Ucopy(_P, _Last, _P + _M);
???_Ufill(_Last, _M - (_Last - _P), _X);
???fill(_P, _Last, _X);
???_Last += _M; }
??else if (0 < _M)
???{_Ucopy(_Last - _M, _Last, _Last);
???copy_backward(_P, _Last - _M, _Last);
???fill(_P, _P + _M, _X);
???_Last += _M; }}
其中M = 1;
當_End - _Last < _M時,就要重新分配內存了,哦原來時這樣的.
[個人認為,在方便調試的時候,可以把C:\MSDEV\VC98\Include\下面的vector文件中的protected改成public:]
下面我給出在5次插入之后其內存分配
push_back(2)
//00481AC0
//00481ACC
//00481AD0
push_back(3);
//00481AC0
//00481AD0
//00481AD0
push_back(4);
//00481B20
//00481B34
//00481B40
push_back(5);
//00481B20
//00481B38
//00481B40
注意沒有,_Last - _First之后的明顯是size() * 4
[注:在VC6.0的STL版本是采用的PJSTL版本,是一種公認最垃圾的STL版本
在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司
在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我認為在可讀性,可移植性方面最好的一個版本]
posted on 2007-01-04 14:26 木木頭 閱讀(946) 評論(1) 編輯 收藏 引用 所屬分類: C++特性