最近、次のステートメントが当てはまらないことに気づきましたstd::string s。
s.max_size() == s.get_allocator().max_size();
std::stringこれは興味深いと思います。デフォルトstd::allocator<char>では、理論上の制限がありsize_type(-1)ます(2の補数を想定していることはわかっていますが、実際の質問とは関係ありません)。実際の制限はこれよりも大幅に少なくなることを私は知っています。一般的な32ビットのx86システムでは、カーネルはアドレス空間の2GB(おそらく1GB)を占有し、実際の上限ははるかに小さくなります。
とにかく、GNU libstdc ++std::basic_string<>::max_size()は、使用しているアロケータが何を言っているかに関係なく、同じ値を返すように見えます(のようなもの1073741820)。
それで、疑問は残ります、なぜstd::basic_string<>::max_size()ただ戻ってこないのget_allocator().max_size()ですか?これが架空の上限であるように私には思えます。そして、割り当てが不足している場合は、をスローするだけなstd::bad_allocので、試してみませんか?
これは何よりも好奇心が強いのですが、少なくともこの1つの実装で2つが別々に定義されているのはなぜだろうと思っていました。