C++ クラス内部のvectorについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
oni

C++ クラス内部のvectorについて

#1

投稿記事 by oni » 7年前

初めて質問させて頂きます。
物理シミュレーションのプログラムで、クラス内部にvectorを使用するプログラムを作成しています。

コード:

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

class hoge{
private:

public:
  
  vector<int> order;
  int num;
  hoge(int);
  ~hoge();

};

hoge::hoge(int num)
  : num(num)
{};

hoge::~hoge(){
  vector<int>().swap(order);
}

int main(){

  int n = 10000000;
  vector<hoge> obj;
  obj.reserve(n);
  
  for(int i=0; i<n; i++){
    obj.push_back( hoge(i) );
  }
  for(int i=0; i<n; i++){
    obj[i].order.push_back(i);
  }

  cout << sizeof(obj[0]) << endl;

  vector<hoge>().swap(obj);//ここでobjをすべて開放したい
  
  return 0;
}
このプログラムではobjクラスのサイズが32バイトとなっており、objの配列を多く使用するため、メモリを圧迫しています。
また、途中でobjの解放を行いたいのですが、swapを用いてもすべて解放することができません。

質問として、
データメンバとしてvectorを宣言するとなぜこのような大きなサイズになるのか?
サイズの縮小方法はあるのか?
解放はどのように行えばよいか?

説明不足かもしれませんが、よろしくお願い致します。

史上最悪のデスペナ
記事: 521
登録日時: 9年前

Re: C++ クラス内部のvectorについて

#2

投稿記事 by 史上最悪のデスペナ » 7年前

nがものすごい値なのが原因じゃないでしょうか
よく分かりませんが

swapに関しては
http://www.geocities.jp/ky_webid/cpp/library/002.html

一時オブジェクトを作り、既存の vector をコンストラクタの引数に渡します。 すると、既存の vector が持っていた要素と同じ個数を持った vector が作られます。 それを swap関数で、既存の vector と交換すると、要素の中身はそのままで、無駄な領域だけが消え去ります。
と書かれています
なので、全てを削除するのはswapでは無理じゃないかと

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: C++ クラス内部のvectorについて

#3

投稿記事 by tk-xleader » 7年前

vector<hoge>().swap(obj);
の一文は、More C++ Idioms/空にして最小化(Clear-and-minimize)だから、なんら問題ないです。

で、要するに、これをやって、std::vectorを最小化しても、メモリの使用量が減らないって事が問題なんですよね。これは、newなどの呼び出しによってプログラムが処理系にヒープ領域を要求した後、deleteなどによってその領域を解放したとしても、処理系がそのプログラムが使用しているヒープ領域を解放するとは限らないからですね。
つまり、プログラム上は開き領域であっても、システム上は裏でヒープ領域が使用中になってるから、システムから見たメモリの使用量が減らないというわけでしょう。まぁ、現段階では、憶測の域を出ませんけど…

閉鎖

“C言語何でも質問掲示板” へ戻る