34

std::stringmax_size()含めることができる要素の最大数を決定する方法を提供します。

ただし、一般に文字列の最大長を計算するには、プログラマーは(おそらく空の)文字列オブジェクトを作成する必要があります。

このクラスがプログラマーからの情報を必要としない場合max_size()、コンパイル時定数として使用できないのはなぜですか?文字列が最大サイズを計算するために必要な実行時情報はありますか?

4

4 に答える 4

22

その理由の1つは、このmax_size機能がまったく役に立たず、委員会がそれを修正しようとするのに苦労する価値があるとは考えていないことです。文書化されたインターフェースの一部であるため、そのままにしておきます。

ライブラリ欠陥レポート#197を参照してください。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197

max_size()はあまり多くのことに役立ちません。また、max_size()を使用できるいくつかのケースでは、既存の表現は十分に明確です。既存の文言を変更する試みはどれも改善ではありませんでした。

于 2012-10-30T12:34:23.423 に答える
18

std::string::max_size()std::allocator::max_size()ボンネットの下で呼び出します。

標準によると、20.9.6.1.10:

size_type max_size() const noexcept;

戻り値:allocate(N、0)の呼び出しが成功する可能性のある最大値N。

(参照:allocator :: max_size

理論的には、アロケータの実装は、syscallを介して割り当てることができるメモリのチャンクの最大サイズを計算できる可能性があります。これは、特定のプロセス内で、文字列の可能な最大サイズを決定するのに役立ちます。

于 2012-10-30T11:31:53.717 に答える
5

の呼び出しmax_size()は、コンテナに使用されるアロケータに委任されます。

理論的には、非常にスマートなアロケータはmax_size、たとえば使用可能なRAMに応じて、実行時に計算できます。

于 2012-10-30T11:23:50.997 に答える
0

これも機能するはずです:

enum : std::string::size_type {
    npos     = std::string::size_type(-1),
    max_size = npos - 1
};
于 2012-10-30T22:12:16.960 に答える