一、内存分配:
- 编译器会为每一个 string 对象分配 24 个字节的栈空间;
- 如果要存储的字符串长度(strlen 而非 sizeof)小于等于 22,则直接存储在函数栈中;最后一个字节(地址最高处)存储字符串的实际长度;
- 如果要存储的字符串长度超过 22,会另外分配堆内存空间存储字符串本身,栈内的 24 个字节空间另有他用:
-
- 将字符串在堆中的地址存储在 24 个字节的前 8 个字节;
- 中间 8 个字节存储字符串的长度;
- 最后 8 个字节:地址最高的字节固定为 0x80,剩余字节存储分配的堆空间大小。
二、计算大小:
#include <iostream>
#include <string>
int main()
{
std::string str = "Hello, World!"; // 创建一个包含字符数据的std::string对象
std::cout << "Size of string object: " << sizeof(str) << std::endl; // 输出std::string对象的大小:40
std::cout << "Size of string : " << sizeof(std::string) << std::endl; // 输出std::string的大小:40
std::cout << "Length of string: " << str.length() << std::endl; // 输出字符串的实际长度 : 13
return 0;
}
注意事项:sizeof(std::string)和 sizeof(str) 表示 std::string对象本身的大小,而不是存储的字符串数据的大小,str.length()才能表示本身字符串的长度;
三、 规定大小:
std::string str ;
str.reserve(100);
在结构体中:
struct Struct
{
std::string a;
}
Struct myStruct;
myStruct.reserve(100);
使用场景:
在进行不同语言之间传输时,需要确定每个变量的内存大小,所以string变量尽量使用char []来替换;
注意事项:string类型的变量必须实例化之后才能规定大小,不能声明类型的大小。