libstdc++ allocator and allocation

C++ 標準は文字列、コンテナクラス、iostream の一部のメモリ管理を std::allocator というテンプレートクラスを使ってカプセル化する。
標準が要求するものは:

C++ 標準はこの分野について、少しの指針しか示していない:

  • コンテナに要素を追加した時、コンテナはその時点より多くのメモリを確保しなければならないが、それはテンプレートパラメータ "Allocator" を介して行う。この事は、通常の STL コンテナのみならず、 string クラスに文字を追加する事も含まれる。
  • 型 T に対する全てのコンテナに対するデフォルトの Allocator は std::allocator である。
  • allocator クラスのインターフェイスは非常に単純である。約20個の public 宣言(ネストした typedef、メンバ関数等)を持つが、重要なものは 2つしかない:
  T*	allocate   (size_type n, const void* hint = 0);
  void	deallocate (T* p, size_type n);

  (これは簡単にしたものだ; 実際のシグネチャはネストした tyepdef を用いている)
  両関数にある引数 "n" は、型 T を確保する為の領域のサイズであり、(コンテナに含まれる要素の)合計サイズではない。
  • 記憶域は "::operator new(size_t)" を呼ぶことによって獲得される。しかし、この関数がどのようなタイミングで呼ばれるかは規定されない。"hint"も規定されない。これは実装がローカルに使用する目的で存在する。

完全な詳細は C++ 標準の [20.4 Memory] に記述されている。