木曜日, 7月 18, 2013

vectorのリサイズによるアドレスの変更?

SafeC++にはvectorに要素が多く積み込まれると,リサイズ(デフォルトサイズは恐らく16)により,ベクタは他のメモリアドレス上にコピーを作りそこにデータをコピーする,とあった.それが本当であるならば,コンポジションクラス中のvector参照メンバ及びポインタメンバはリサイズが発生した場合,無効になるわけである.

本当だろうか?検証してみた.

以下のコードはvector参照メンバ v をクラスにセットして,vにデータを積み込む単純なコードである.データ積み込みの前と後で番地の値を取得し,かつsize()を呼んでいる.

結果はデータ積み込み前と後でアドレスは一緒,size()も無事動作した.
ちなみにg++は4.7.3, OSはFedora18. Visual Studioは2010, OSはWindows7 32bit.

#include <vector>
#include <iostream>
using namespace std;

class MyClass {
private:
 vector<int>& v;
public:
 MyClass(vector<int>& vParam) : v(vParam) {}
 const vector<int>& GetV() { return v;}
 
 void Init() {

  for(int i = 0;i < 10;i++ ) {
   v.push_back(i);
  }
 }
 
 void Expand() {

  for(int i = 0;i < 50000;i++ ) {
   v.push_back(i);
  }
 }
 
 int size() {
  return v.size();
 }

};

int main() {

 vector<int> v;
 v.resize(20);
 
 MyClass m(v);
 m.Init();
 cout << &(m.GetV()) << m.size() << endl;
 m.Expand();
 cout << &(m.GetV()) << m.size() << endl;

}


結果
0x22ac5430
0x22ac5450030

0 件のコメント: