Maximum length of a std::basic_string<_CharT> string

你离开我真会死。 提交于 2019-12-01 23:51:08

The comments in basic_string.h from GCC 4.3.4 state:

    // 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.

In particular, note the last line, "In addition, this implementation quarters this amount." I take that to mean that the division by four is in fact entirely arbitrary.

I tried to find more information in the checkin log for basic_string.h, but it only goes back to October 5, 2000, and this comment was already present as shown in that revision, and I'm not familiar enough with that code base to know where the file might have lived in the source tree before it was moved to its current location.

You could create a small wrapper class that contains a std::string. Expose the interface functions you care about. If any function call would increase your string beyond your desired maximum length, you could throw an exception or otherwise trigger an error.

This is intended as a way to achieve your goal (fix a max length on your string) without digging into the mess of deciphering the standard library implementation.

If you don't mind checking at runtime, you can call std::string::max_size, which returns the maximum possible length of a string. This won't give you any reasons for its result (and I've no idea what the /4 is for in the GNU code I'm afraid) but it will at least give you something definite to work with.

This is not a static function though so determining the right value for every string might require a bit of care and/or a spot of system-specific code. (The VC++ string looks to defer to its allocator for this information, for example. That means that different strings could have different maximum sizes, if they're using different allocators, I suppose.)

The practical limit is likely to be much smaller than the absolute limit. Memory allocation will fail, for example. The practical limits can't really be known ahead of time.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!