C++ STL いろいろ

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

C++ 標準テンプレートライブラリ(STL)に関する小ネタ、気づき、メモなど。

STLコンテナそのもの、およびイテレータのサイズは?

中身が数個または空のコンテナを大量に生成する場合にはコンテナ本体のサイズが気になるので実験してみた。イテレータのサイズも同時に調べてみた。

なお、これらのサイズは実装依存であることに注意。

#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <string>
#include <unordered_set>
#include <unordered_map>
#include <iostream>
 
template <typename T>
void output_size_(const T &x, const char *name) {
  std::cout << "sizeof" << name << " = "
            << sizeof(T) << "\n";
  std::cout << "sizeof iterator = "
            << sizeof(typename T::iterator) << "\n\n";
}
 
#define output_size(X) output_size_(X, #X)
 
int main() {
  std::cout << "sizeof(int) = " << sizeof(int) << "\n";
  std::cout << "sizeof(int*) = " << sizeof(int*) << "\n\n";
  output_size((std::vector<int>()));
  output_size((std::deque<int>()));
  output_size((std::list<int>()));
  output_size((std::set<int>()));
  output_size((std::map<int,int>()));
  output_size((std::multiset<int>()));
  output_size((std::multimap<int,int>()));
  output_size((std::string()));
  output_size((std::unordered_set<int,int>()));
  output_size((std::unordered_map<int,int>()));
  output_size((std::unordered_multiset<int,int>()));
  output_size((std::unordered_multimap<int,int>()));
}
 

結果

gcc version 4.5.0 (GCC), Target: i686-pc-cygwin
sizeof(int) = 4
sizeof(int*) = 4

sizeof(std::vector<int>()) = 12
sizeof iterator = 4

sizeof(std::deque<int>()) = 40
sizeof iterator = 16

sizeof(std::list<int>()) = 8
sizeof iterator = 4

sizeof(std::set<int>()) = 24
sizeof iterator = 4

sizeof(std::map<int,int>()) = 24
sizeof iterator = 4

sizeof(std::multiset<int>()) = 24
sizeof iterator = 4

sizeof(std::multimap<int,int>()) = 24
sizeof iterator = 4

sizeof(std::string()) = 4
sizeof iterator = 4

sizeof(std::unordered_set<int,int>()) = 36
sizeof iterator = 8

sizeof(std::unordered_map<int,int>()) = 32
sizeof iterator = 8

sizeof(std::unordered_multiset<int,int>()) = 36
sizeof iterator = 8

sizeof(std::unordered_multimap<int,int>()) = 32
sizeof iterator = 8

コンテナ本体のサイズではdequeの大きさが目立つ(ポインタ10個分!)。stringのサイズはポインタ一つ分しかないが、これは長さ、キャパシティ、参照カウントの情報を文字列本体として確保された領域の最初の領域に置いているため。この小技によって空文字列はポインタ一つ分の領域しか消費しなくなる。

イテレータのサイズは概してポインタ一つ分であるが、unorderedなコンテナはポインタ2つ分、dequeはなんとポインタ4つ分と大盤振る舞い。

なお、reverse_iteratorも同じサイズ。

ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。