なぜはstd ::文字列されていない::のmax_size()==のstd ::文字列::アロケータ::のmax_size()

StackOverflow https://stackoverflow.com/questions/1592476

  •  22-09-2019
  •  | 
  •  

質問

最近、私は次の文は、std::string s与えられた事実ではないことに気付きました。

s.max_size() == s.get_allocator().max_size();

私はstd::stringの理論上の限界があるstd::allocator<char>使用するデフォルトのsize_type(-1)によってこの面白い、見つける(はい私は、私は2の補数を仮定している知っているが、それは、実際の質問には無関係です)。私は実用的な制限は、これよりも大幅に少ないだろうことを知っています。典型的な32ビット、x86システム上で、カーネルは、はるかに小さい実用的な上限を残すアドレス空間2GBの(おそらく1ギガバイト)を占めることになる。

とにかく、GNUのlibstdc ++のstd::basic_string<>::max_size()にかかわらず、それが使用しているアロケータは(1073741820のようなものを)言うのと同じ値を返すように表示されます。

問題が残るので、なぜstd::basic_string<>::max_size()だけget_allocator().max_size()を返さないのですか?仮想的な上限であるように私には思えます。そして、割り当てが短い起動した場合、それだけで、std::bad_allocを投げるよそうしようとしないのはなぜ?

2は、少なくともこの1つの実装で個別に定義されている理由は、

これは、私は思っていた何よりも好奇心である。

役に立ちましたか?

解決

マイクロソフト接続で投稿されましたのバグあなたの質問に関連。マイクロソフトがそれに面白い答えを持っています:

  我々は明らかにMAX_SIZEのため、意図した目的は、()であるかを説明しない標準、当社の解釈によるとすることでデザインとして、それを解決しました。アロケータMAX_SIZEは、())( "最大有意義Xに渡すことができる値::割り当てる()"(C ++ 03 20.1.5 [lib.allocator.requirements] /表32)が、容器MAX_SIZEとして記載されています"()最大の可能なコンテナのサイズ" と記載(23.1 [lib.container.requirements] /表65)。何が容器MAX_SIZEは()アロケータMAX_SIZEに由来するかどうかについて説明していません()。長年の我々の実装では、アロケータMAX_SIZE()から直接容器MAX_SIZE()を導出し、次いで等オーバーフローチェックし、この値を使用しています。など、あなたのような標準的な他の解釈が、可能ですが、私たちに明確に正しくありません。標準の文言は、確かにここで明確化から利益を得ることができます。ない限り、そしてそれが起こるまで、我々は二つの理由から変わらず私たちの現在の実装を残すことにしました:(1)他の顧客は、当社の現在の動作に依存することができる、及び(2)のmax_size()基本的には何も購入していません。せいぜい、(コンテナなど)アロケータを消費する事が割り当てたときに()が失敗します予測する)(アロケータのmax_sizeを使用することができます - )単に呼び出しが(割り当てるアロケータが、メモリを与えることを決定したりしないので、より良いテストです。コンテナを消費する事がどのように大きなサイズ()の保証がかもしれないが、シンプルな保証はsize_typeの範囲である。

のように、コンテナのmax_size()を使用することができます
さらにここで

あなたは可能性がするコア問題#197を見つけます。委員会は、標準の文言を改善するための要求を検討したが、それが承認されなかった。

あなたの質問への答えだから、「なぜ..?」 )標準は明らかに(MAX_SIZEのために何を意図した目的を説明していないということです。

他のヒント

私がいない完全に確認してくださいしかし、私の知る限りstd::basic_stringを知っているように連続したメモリ内の文字列を格納するために、現在の標準に限定されるものではないと思います。例えば、それはいくつかのチャンクでそれを格納することができます。このような各チャンクは、次いでstd::allocator::max_size()に限定されるが、合計がそれより大きくてもよい。

また、STLコンテナの場合のようです。そして、すべてのstd::basic_string後の容器である。

はGCCの実装は、それらがmax_size(一方は文字列を単一のブロックとして割り当てられる内部ハウスキーピングオブジェクトのサイズを減算する必要がある)の計算方法についてコメントを有しており、そのmax_size()は、その四半期を返す追加します。与えられた何の根拠はので、おそらくそれだけで安全マージンで、ありませんか? (また、おそらく1が非常に大きい文字列を使用するロープのクラスを提供する必要がありますか?)

おそらくアカウントにヌル文字を終了する - VC ++ max_size()戻っ少ないallocator.max_size()以上1で

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top