4

C++ 標準 [§27.8.2.1p4] の私のコピーから:

basic_stringbuf(basic_stringbuf&& rhs);

効果: 構造体を右辺値 rhs から移動します。*this (eback(), gptr(), egptr(), pbase(), pptr(), epptr()) 内のシーケンス ポインタが rhs が持っていた値を取得するかどうかは実装定義です。そうであろうとなかろうと、 *this と rhs は構築後に別々のバッファを (もしあれば) 参照します。openmode、locale、および rhs のその他の状態もコピーされます。

にも同様の文が使われていbasic_filebuf(basic_filebuf&& rhs);ます。

質問

なぜこれが実装定義なのか疑問に思っていましたか? ポインターをコピーしたくない理由はありますか?

4

1 に答える 1

2

標準ストリームバッファのバッファに対処するための2つの明らかな実装手法があります。

  1. バッファをオブジェクトに埋め込んで、オブジェクトのフットプリントを大きくすることができますが、小さな文字列やファイルへのメモリ割り当てを回避できます。
  2. ヒープに割り当てられたバッファをポイントし、メモリ割り当てを犠牲にして潜在的に大きなバッファを処理することができます。

バッファが存在する場所の実装の選択に応じて、新しいポインタ値のセットが必要になるか、ポインタをそのまま引き継ぐ必要があります。どちらの戦略も「より良い」ものではなく、戦略を組み合わせたバリエーションも想像できます。したがって、選択を行う代わりに、実装が選択できます。あなたの質問が、実装がそれが行った選択を文書化することになっている理由である場合:それは明らかに私を超えています。私の個人的な推測では、「実装が定義されている」フェーズは選択の自由を提供すると想定され、実装がその選択を述べる必要があるという意味は無視されました(引用符についての議論があったため:1.3.10 [defns.impl.defined]-奇妙なことに段落番号なし)。

于 2012-11-02T22:48:13.253 に答える