1. ホーム
  2. c++

[解決済み] なぜstd::get_temporary_bufferが必要なのですか?

2023-05-15 03:41:03

疑問点

どのような目的で std::get_temporary_buffer ? Standardには次のように書かれています。

最大n個の隣接するTオブジェクトを格納するのに十分なストレージへのポインタを取得します。

バッファはスタック上に確保されると思ったのですが、そうではありません。C++標準によると、このバッファは実際には一時的なものではありません。この関数は、グローバル関数の ::operator new と比べて、この関数はどのような利点があるのでしょうか?次のステートメントが等価であることは正しいですか?

int* x;
x = std::get_temporary_buffer<int>( 10 ).first;
x = static_cast<int*>( ::operator new( 10*sizeof(int) ) );

この機能はシンタックスシュガーのためだけに存在するのでしょうか?なぜ temporary があるのでしょうか?


一つの使用例が ドブ博士の日記、1996年7月1日号 で、アルゴリズムを実装するための使用例が提案されています。

<ブロッククオート

バッファが割り当てられなかったり、要求されたものより小さかったりしても、アルゴリズムは正しく動作し、単に速度が低下するだけです。

どのように解決するのですか?

Stroustrupは次のように言っています。 C++ プログラミング言語" ( §19.4.4 , SE)。

このアイデアは、システムが固定サイズのバッファをいくつか用意しておき、高速に割り当てられるようにすることです。 n オブジェクトのためのスペースを要求すると n . しかし、それ以下の数しか得られない場合もあります。 get_temporary_buffer() を使う一つの方法は、楽観的に多くを求め、そして、たまたま利用可能なものを使うことです。

[というのも get_temporary_buffer() は低レベルで、一時的なバッファを管理するために最適化されている可能性が高いので、これは 新しい または アロケータ::アロケート() を使用すると、より長期のストレージを取得できます。

また、彼は2つの機能の紹介をこう始めています。

アルゴリズムはしばしば、許容できるパフォーマンスを発揮するために一時的な空間を必要とします。

...しかし、以下の定義は提供されていないようです。 一時的 または 長期的 のいずれかになります。

An アネクドート 数学から一般的なプログラミングへ。 には、StepanovがオリジナルのSTLの設計で偽のプレースホルダー実装を提供したことが書かれています。

驚いたことに、彼は数年後に、STL の実装を提供するすべての主要なベンダーがまだこのひどい実装を使用していることを発見しました[...]。