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

2023-12-01

我想知道如何确定给定平台的字符串(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。我完全不知道为什么!

我查了很多地方寻求解释,但都找不到令人满意的解释(这就是为什么我一直在试图弥补一些东西!如果我错了,请纠正我!!)。


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.

特别注意最后一行,“此外,本次实施将这一金额分为四等分。”我认为这意味着除以四实际上是完全任意的.

我试图在以下位置找到更多信息basic_string.h 的签入日志,但它只能追溯到 2000 年 10 月 5 日,并且该注释已经存在,如该修订版中所示,并且我对该代码库不够熟悉,无法知道该文件在发布之前可能位于源代码树中的位置移动到当前位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::basic_string<_CharT> 字符串的最大长度 的相关文章

随机推荐

  • 编译器为内在函数生成的程序集的问题

    我正在使用英特尔 SSE AVX FMA 内在函数来实现某些数学函数的完美内联 SSE AVX 指令 给出以下代码 include
  • 在 BLE 中随机化 Mac 地址

    我制作了一款将 iOS 设备变成信标的应用程序 现在 当我从 Android 设备扫描 BLE 设备时 我在扫描列表中找到了该 iOS 设备 但问题是每次我都得到随机的 Mac 地址 所以 我的问题是 这种默认行为是否意味着获取随机 mac
  • pine 脚本中 := 和 = 运算符之间的区别

    我对 TradingView Pine 脚本非常陌生 我没有找到合适的参考来理解两者之间的区别 and 运营商 有人有参考或描述吗 提前致谢 用于声明和初始化变量 用于在初始化后为变量赋值 将其转换为 可变变量 任何不可变变量 follow
  • 如何在 iPhone 中裁剪图像

    我想做同样的事情this问题 在我的应用程序中 我想像在 Facebook 中进行图像裁剪一样裁剪图像 任何人都可以通过优秀教程的链接或任何示例代码来指导我 我提供的链接将完整描述我的要求 您可以创建具有任何属性的新图像 这是我的功能 女巫
  • 顺序索引的填充因子为 PK

    Yes fillfactor再次 我花了很多时间阅读 但无法决定哪种方案最适合每种情况 我不明白碎片何时以及如何发生 我正在将数据库从 MS SQL Server 迁移到 PostgreSQL 9 2 Case 1 在顺序 串行 PK 中每
  • Android 应用程序中的 JPEG 硬件解码支持

    我的 Android 应用程序需要在 Android 2 2 手机 及更高版本 上解码基于大分辨率的 JPEG 图像 目前我正在使用 BitmapFactory decodeStream API 即 SKIA 库来解码流 1 据我所知 SK
  • android.os.ServiceSpecificException:GPIO2_IO02 已在使用中(代码 16)

    我正在研究 android 的东西 Pico i MX7D I O 我得到了android os ServiceSpecificException GPIO2 IO02 已在使用中 代码 16 异常 这是什么意思 请帮我 我的示例程序是从克
  • Spring中有Spring惰性代理工厂吗?

    Wicket 有一个称为惰性代理工厂的设备 鉴于
  • 调整 ctypes 数组的大小

    我想调整 ctypes 数组的大小 如您所见 ctypes resize 无法正常工作 我可以编写一个函数来调整数组大小 但我想知道一些其他解决方案 也许我错过了一些 ctypes 技巧 或者也许我只是错误地使用了调整大小 名称 c lon
  • 在 Javascript 中向 css 样式属性添加 1

    我试图首先获取元素的 order 属性的值 然后在单击按钮时向其添加 1 问题是 我得到的是 11 而不是得到 1 再加上 1 再得到 2 运算符不应该添加这些值吗 我究竟做错了什么 carouselPrev addEventListene
  • 如何在 R 上为每个方面(条形图)注释不同的值?

    我想知道如何注释条形图中的每个方面 现在 我正在使用 geom signif 函数 该函数工作完美 只是它将一个面上的注释复制到另一个面上 我的代码是这样的 geom signif annotation c p 0 01 y positio
  • 指针运动。为什么数字这么高?为什么它以块而不是恒定流的形式打印信息?

    你好 我正在尝试编写一个程序 需要报告每个鼠标运动的位置 我已经打电话给XSelectInput 函数与PointerMotionMask面具 一切似乎都正常 但打印后的数字不会在每次移动后出现 它们以块的形式出现 并且也以块的形式出现ev
  • 如何正确地将 CSV 文件解析为二维数组?

    我正在尝试将 csv 文件解析为二维数组 其中每一行都是一个数据条目 每一列都是该条目中的一个字段 一次性完成这一切可以简化处理代码并将其与解析代码分开 我尝试编写一个简单的解析器 使用String Split用逗号分隔文件 据我发现 这是
  • Oracle - 不能在 select 子句中与其他列一起使用 * 符号

    抱歉 如果它很微不足道 但是选择列 标志并不总是有效 而且我没有找到对此行为的参考 我可以选择表格A和列col并附有以下声明 select from A and select col from A and select aa col aa
  • SQLAlchemy - 当 count() 表示还有更多结果时,仅返回一个结果

    我遇到了一个非常大的结果集只返回一行的问题 Session query TestSet join Instance count gt gt 4283878 Session query TestSet join Instance offset
  • HttpURLConnection Post:输出流没有效果?

    我正在开发一个 Android 应用程序 并且已经发现不同的 Android 版本在处理 Http s URLConnections 方面有不同的方式 http stackoverflow com q 9556316 151682 我遇到了
  • 如何获取 Java Stream 中每种类型(按属性选择)的第一个对象(按函数排序)

    想象一个具有 3 个属性的简单对象 public class Obj boolean toBeAdded String type int order public Obj boolean toBeAdded String type int
  • 我想要异常处理“列表索引超出范围”。

    我在用美丽汤并解析一些 HTML 我从每个 HTML 中获取特定数据 使用for循环 并将该数据添加到某个列表中 问题是 某些 HTML 的格式不同 而且他们没有我想要的数据 所以 我试图使用异常处理并增加价值null到列表 我应该这样做
  • 不常见的 IP 符号

    我知道可以将 IPv4 中的 IP 写为整数 例如2130706433代替127 0 0 1 造成这种可能性的原因是什么 IPv6 有类似的表示法吗 I tried ping 6 1作为尝试 ping 1 但这不起作用 主机不存在 IPv4
  • std::basic_string<_CharT> 字符串的最大长度

    我想知道如何确定给定平台的字符串 C 中 长度的上限 我仔细检查了很多库 其中大多数都是任意定义的 GNU C STL 具有实验性 C 0x 功能的 STL 有一个相当明确的定义 size t npos size t 1 lt The ma