std::string
max_size()
含めることができる要素の最大数を決定する方法を提供します。
ただし、一般に文字列の最大長を計算するには、プログラマーは(おそらく空の)文字列オブジェクトを作成する必要があります。
このクラスがプログラマーからの情報を必要としない場合max_size()
、コンパイル時定数として使用できないのはなぜですか?文字列が最大サイズを計算するために必要な実行時情報はありますか?
std::string
max_size()
含めることができる要素の最大数を決定する方法を提供します。
ただし、一般に文字列の最大長を計算するには、プログラマーは(おそらく空の)文字列オブジェクトを作成する必要があります。
このクラスがプログラマーからの情報を必要としない場合max_size()
、コンパイル時定数として使用できないのはなぜですか?文字列が最大サイズを計算するために必要な実行時情報はありますか?
その理由の1つは、このmax_size
機能がまったく役に立たず、委員会がそれを修正しようとするのに苦労する価値があるとは考えていないことです。文書化されたインターフェースの一部であるため、そのままにしておきます。
ライブラリ欠陥レポート#197を参照してください。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197
max_size()はあまり多くのことに役立ちません。また、max_size()を使用できるいくつかのケースでは、既存の表現は十分に明確です。既存の文言を変更する試みはどれも改善ではありませんでした。
std::string::max_size()
std::allocator::max_size()
ボンネットの下で呼び出します。
標準によると、20.9.6.1.10:
size_type max_size() const noexcept;
戻り値:allocate(N、0)の呼び出しが成功する可能性のある最大値N。
理論的には、アロケータの実装は、syscallを介して割り当てることができるメモリのチャンクの最大サイズを計算できる可能性があります。これは、特定のプロセス内で、文字列の可能な最大サイズを決定するのに役立ちます。
の呼び出しmax_size()
は、コンテナに使用されるアロケータに委任されます。
理論的には、非常にスマートなアロケータはmax_size
、たとえば使用可能なRAMに応じて、実行時に計算できます。
これも機能するはずです:
enum : std::string::size_type {
npos = std::string::size_type(-1),
max_size = npos - 1
};