最終更新日時:
が更新

履歴 編集

function template
<memory>

std::get_temporary_buffer

// C++03
template <class T>
pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t n);

// C++11
template <class T>
pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept;

概要

短期的なメモリ領域を確保する。

効果

この関数は、強制ではない要素数の指定nに対して、連続する型Tのオブジェクトのための未初期化の領域を確保する。

戻り値

領域へのアドレスをfirst、領域の容量(要素数単位)をsecondとするpairオブジェクトを返す。容量はnより小さいかもしれないし、大きいかもしれない。

n <= 0の場合、または領域が全く確保できなかった場合は、firstをヌルポインタ、second0として返す。

例外

  • C++11 : 投げない

備考

例えばstable_sort() など、アルゴリズムによっては追加のメモリ領域を利用することで計算量を低減できるものがあり、この関数は主にそういったアルゴリズムの実装内で使用される。

この関数は、短期的なメモリ領域のため、たとえば実装が保持している空き領域リストからサイズの照合を省いて領域を返すなど、実装が最適化されている可能性がある。std::allocator::allocate()を長期的に使用するメモリとして使用することで、この関数との使い分けができるだろう。

ただし、Visual C++ 12.0、GCC 4.8 (libstdc++)、Clang 3.4 (libc++)は単にnewを呼んでいるだけで、最適化はとくに行っていない。

#include <iostream>
#include <memory>

int main()
{
  // int型のオブジェクトを3つ構築する想定の領域確保を依頼
  std::pair<int*, std::ptrdiff_t> result = std::get_temporary_buffer<int>(3);

  int* p = result.first;
  std::size_t size = static_cast<std::size_t>(result.second);

  std::allocator<int> alloc;
  using traits = std::allocator_traits<std::allocator<int>>;

  // オブジェクトを構築
  for (std::size_t i = 0; i < size; ++i) {
    traits::construct(alloc, p + i);
  }

  // オブジェクトを破棄
  for (std::size_t i = 0; i < size; ++i) {
    traits::destroy(alloc, p + i);
  }

  // 確保した領域を解放
  std::return_temporary_buffer(p);
}

出力

参照