【发布时间】:2011-08-01 06:26:42
【问题描述】:
如问题中所述。
std::string myVar;它可以容纳的最大字符由堆栈或堆决定?
谢谢
【问题讨论】:
如问题中所述。
std::string myVar;它可以容纳的最大字符由堆栈或堆决定?
谢谢
【问题讨论】:
std::string 对象的分配方式与int 或任何其他类型的分配方式相同:如果它是局部变量,则在堆栈上,或者它可能是static,或者如果new std::string,则在堆上使用或new X,其中X 包含string 等。
但是,std::string 对象可能 至少包含一个指向附加内存的指针,该指针由实例化 basic_string 的分配器提供 - 对于 std::string typedef 这意味着堆-分配的内存。直接在原始 std::string 对象内存中或在指向堆中,您可以期望找到:
一些std::string 实现具有“短字符串”优化,它们将只有几个字符的字符串直接打包到字符串对象本身中(为了提高内存效率,通常使用某种与用于其他目的的字段的联合,当字符串更长)。但是,对于其他字符串实现,甚至对于那些在处理太长而无法直接放入 std::string 对象的字符串时进行短字符串优化的实现,它们必须遵循对存储的文本数据的指针/引用在分配器提供的(堆)内存中。
【讨论】:
默认情况下,为std::string分配的内存是动态分配的。
注意std::string 有一个max_size() 函数,它返回实现支持的最大字符数。但是,这样做的用处是值得怀疑的,因为它是实现的最大值,并且没有考虑其他资源,例如内存。你的实际限制要低得多。 (尝试分配 4GB 的连续内存,或考虑其他地方的内存耗尽。)
【讨论】:
myVar 是堆栈分配的,但是它拥有一个内部缓冲区来存储堆分配的字符串(通常)。 std 容器通常采用Allocator 参数,该参数负责分配资源,并且通常在堆上分配,尽管它可以(理论上)在堆栈上分配。