std :: basic_string的最大长度< _CharT>串

时间:2010-03-19 17:51:54

标签: c++ string limit system-dependent

我想知道如何修复给定平台的字符串长度(在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 */

以下是我对公式的理解:

  • size_t类型必须包含分配给字符串的单位数(每个单位的类型为_CharT)
  • 从理论上讲,size_t类型的变量可以采用的最大值是可以分配的1字节(即char类型)的单元总数
  • 前一个值减去跟踪分配的内存所需的开销(_Rep_base)因此是字符串中的最大单元数。将此值除以sizeof(_CharT),因为_CharT可能需要多于一个字节
  • 从上一个值中减去1以说明终止字符
  • 最后,将该师除以4.我绝对不知道为什么!

我看了很多地方寻求解释,但在任何地方找不到令人满意的地方(这就是为什么我一直在努力为它做点什么!如果我错了请纠正我!)。

4 个答案:

答案 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)

实际限制可能远小于绝对限制。例如,内存分配将失败。实际的限制不能提前确定。