我想知道如何修复给定平台的字符串长度(在C ++中)的上限。
我仔细检查了很多库,其中大多数都是任意定义的。 GNU C ++ STL(具有实验C ++ 0x功能的STL)有一个很明确的定义:
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 */
以下是我对公式的理解:
我看了很多地方寻求解释,但在任何地方找不到令人满意的地方(这就是为什么我一直在努力为它做点什么!如果我错了请纠正我!)。
答案 0 :(得分:2)
来自GCC 4.3.4的basic_string.h中的注释状态:
// The maximum number of individual char_type elements of an
// individual string is determined by _S_max_size. This is the
// value that will be returned by max_size(). (Whereas npos
// is the maximum number of bytes the allocator can allocate.)
// If one was to divvy up the theoretical largest size string,
// with a terminating character and m _CharT elements, it'd
// look like this:
// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
// Solving for m:
// m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
// In addition, this implementation quarters this amount.
特别要注意最后一行,“此外,这个实现还有这个数量。”我认为这意味着四分之一实际上是完全随意
我试图在checkin log for basic_string.h中找到更多信息,但它只能追溯到2000年10月5日,这个评论已经出现,如该修订版所示,我对该代码不够熟悉base,以便在文件移动到当前位置之前知道文件在源树中可能存在的位置。
答案 1 :(得分:0)
您可以创建一个包含std::string
的小包装类。公开您关心的界面功能。如果任何函数调用会使您的字符串超出所需的最大长度,则可能会抛出异常或以其他方式触发错误。
这是为了实现您的目标(在字符串上修复最大长度)而无需深入研究破译标准库实现的方法。
答案 2 :(得分:0)
如果您不介意在运行时检查,可以调用std::string::max_size
,它返回字符串的最大可能长度。这不会给你结果的任何原因(我不知道我担心的GNU代码中的/4
是什么)但它至少会给你一些明确的工作。< / p>
这不是一个静态函数,但是确定每个字符串的正确值可能需要一些小心和/或特定于系统的代码。 (例如,VC ++字符串看起来会依赖于它的分配器来获取此信息。这意味着不同的字符串可能具有不同的最大大小,如果它们使用不同的分配器,我想。)
答案 3 :(得分:0)
实际限制可能远小于绝对限制。例如,内存分配将失败。实际的限制不能提前确定。