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も同じサイズ。
最終更新:2010年09月28日 19:09