【问题标题】:c++ maximum std::string length is dictated by stack size or heap size?c ++最大std :: string长度由堆栈大小或堆大小决定?
【发布时间】:2011-08-01 06:26:42
【问题描述】:

如问题中所述。
std::string myVar;它可以容纳的最大字符由堆栈或堆决定?

谢谢

【问题讨论】:

    标签: c++ string max


    【解决方案1】:

    std::string 对象的分配方式与int 或任何其他类型的分配方式相同:如果它是局部变量,则在堆栈上,或者它可能是static,或者如果new std::string,则在堆上使用或new X,其中X 包含string 等。

    但是,std::string 对象可能 至少包含一个指向附加内存的指针,该指针由实例化 basic_string 的分配器提供 - 对于 std::string typedef 这意味着堆-分配的内存。直接在原始 std::string 对象内存中或在指向堆中,您可以期望找到:

    • 一个字符串大小的成员,
    • 可能是某种引用计数器或链接,
    • 字符串存储的文本数据(如果有)

    一些std::string 实现具有“短字符串”优化,它们将只有几个字符的字符串直接打包到字符串对象本身中(为了提高内存效率,通常使用某种与用于其他目的的字段的联合,当字符串更长)。但是,对于其他字符串实现,甚至对于那些在处理太长而无法直接放入 std::string 对象的字符串时进行短字符串优化的实现,它们必须遵循对存储的文本数据的指针/引用在分配器提供的(堆)内存中。

    【讨论】:

      【解决方案2】:

      默认情况下,为std::string分配的内存是动态分配的。

      注意std::string 有一个max_size() 函数,它返回实现支持的最大字符数。但是,这样做的用处是值得怀疑的,因为它是实现的最大值,并且没有考虑其他资源,例如内存。你的实际限制要低得多。 (尝试分配 4GB 的连续内存,或考虑其他地方的内存耗尽。)

      【讨论】:

      • 啊,我认为它会受到堆栈限制,因为它看起来像任何其他本地变量。我猜任何 std:: 对象都是在堆中分配的?
      • @Eugene: 不,myVar 是堆栈分配的,但是它拥有一个内部缓冲区来存储堆分配的字符串(通常)。 std 容器通常采用Allocator 参数,该参数负责分配资源,并且通常在堆上分配,尽管它可以(理论上)在堆栈上分配。
      • @Eugene 这取决于,但对于容器,是的,数据通常在堆中。您总是可以将分配器组合在一起以“使用”堆栈(bleh)。
      • 那么另一个相关问题是,通过复制将 std::string 传递给函数会复制持有者和内部缓冲区以存储实际字符吗?
      • @Eugene - 复制字符串意味着复制所有内容。一些实现尝试延迟字符串内部的复制(写时复制),但这已经过时了。较新的实现将小字符串保留在字符串对象中,并且仅当字符串增长到某个大小以上时才分配动态内存。
      猜你喜欢
      • 2010-12-29
      • 2015-02-13
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多