特定のプラットフォームの文字列の長さ(C ++)の上限をどのように修正できるのか疑問に思いました。
私は多くのライブラリを精査しました、そしてそれらのほとんどはそれを恣意的に定義します。GNU C ++ STL(実験的なC ++ 0x機能を備えたもの)にはかなりの定義があります:
size_t npos = size_t(-1); /*!< The maximum value that can be stored in a variable of type size_t */
size_t _S_max_len = ((npos - sizeof(_Rep_base))/sizeof(_CharT) - 1) / 4; /*!< Where _CharT is a template parameter; _Rep_base is a structure which encapsulates the allocated memory */
これが私が式を理解する方法です:
- size_tタイプは、文字列に割り当てられたユニットの数を保持する必要があります(各ユニットはタイプ_CharTです)
- 理論的には、size_t型の変数がとることができる最大値は、割り当てられる可能性のある1バイト(つまり、char型)のユニットの総数です。
- したがって、前の値から割り当てられたメモリ(_Rep_base)を追跡するために必要なオーバーヘッドを差し引いた値が、文字列内のユニットの最大数になります。_CharTは1バイト以上を必要とする可能性があるため、この値をsizeof(_CharT)で除算します
- 前の値から1を引いて、終了文字を考慮します
- 最後に、それは4による分割を残します。理由はまったくわかりません。
説明のためにたくさんの場所を調べましたが、満足のいく場所がどこにも見つかりませんでした(そのため、私はそれを補うために努力してきました!間違っている場合は訂正してください!!)。