C++字符串是如何存储的?

use*_*902 8 c++ memory string

可能重复:
std :: string及其自动调整内存大小

我只是很好奇,字符串是如何存储在内存中的?例如,当我这样做时:

string testString = "asd";
Run Code Online (Sandbox Code Playgroud)

它分配4个字节,对吧?a + s + d + \0.

但是后来,当我想为这个字符串分配一些新文本时,它可以工作,但我不明白如何.例如,我这样做:

testString = "123456789"
Run Code Online (Sandbox Code Playgroud)

现在它应该是10个字节长.但是如果没有这种字符串的空间呢?假设字符串开头的第五个+第六个字节被其他一些字符占用.CPU如何处理它?它在内存中找到了全新的位置,该字符串适合?

Dav*_*eas 13

这是依赖于实现的,但一般的想法是字符串类将包含指向存储字符串的实际内容的内存区域的指针.两个常见的实现是存储3个指针(分配的区域和数据的开始,数据的结束,分配的区域的结束)或指针(分配的区域和数据的开始)和两个整数(字符串中的字符数和分配的数量)字节).

当新数据附加到字符串时,如果它适合分配的区域,它将被写入,并且数据指针的大小/结尾将相应地更新.如果数据不适合该区域,则将创建新缓冲区并复制数据.

另请注意,许多实现都对小字符串进行了优化,其中字符串类确实包含一个小缓冲区.如果字符串的内容适合缓冲区,则不会动态分配内存,只使用本地缓冲区.

  • 那么 3 个指针是 24 字节(在 64 位架构上)。如果您只是使用它们的空间作为缓冲区来覆盖指针,那么这是一个合理大小的字符串。 (2认同)