C++ 中的 string 在内存中的位置

本文深入探讨了C++中string类型的存储机制,揭示了不同长度的字符串如何在栈和堆中分配内存。当字符串长度小于等于16字节时,其直接在栈上分配;而超过16字节,则通过指针指向堆上的实际数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先不考虑 string 的实质是什么,先做一个实验。
执行如下代码:

int _tmain(int argc, _TCHAR* argv[])
{
	string temp = "LYSM";

	getchar();
	return 0;
}

调试查看 temp 的地址:
在这里插入图片描述
在这里插入图片描述
修改代码为:

int _tmain(int argc, _TCHAR* argv[])
{
	string temp = "LYSM|LYSM|LYSM|LYSM";

	getchar();
	return 0;
}

在这里插入图片描述在这里插入图片描述
神奇,此时 temp 的内存地址中已经不会有 "LYSM|LYSM|LYSM|LYSM" 的字样了。这是因为当前的 temp 长度 > 16字节,(大于16字节的变量放在堆中存储,小于16字节的变量放在栈中存储

😃 可以写代码验证一下:

int _tmain(int argc, _TCHAR* argv[])
{
	string temp = "123456789012345";			// 长度15
	int *a = (int *)malloc(sizeof(int));		// 通过 malloc 申请的内存位于堆中
	int b = 0;									// 通过编辑器初始化的内存位于栈中
	for(auto &c:temp)
	{
		printf("c:%p\n", &c);
	}
	printf("a:%p\n", a);
	printf("b:%p\n", &b);

	getchar();
	return 0;
}

在这里插入图片描述

将变量长度增加后:

int _tmain(int argc, _TCHAR* argv[])
{
	string temp = "1234567890123456";			// 长度16
	int *a = (int *)malloc(sizeof(int));		// 通过 malloc 申请的内存位于堆中
	int b = 0;									// 通过编辑器初始化的内存位于栈中
	for(auto &c:temp)
	{
		printf("c:%p\n", &c);
	}
	printf("a:%p\n", a);
	printf("b:%p\n", &b);

	getchar();
	return 0;
}

在这里插入图片描述

了解了这些我们大概就明白了。但是还有一点没有明了,那就是长度 > 16字节的 temp 怎么通过 &temp 去访问堆中的数据呢?
再次看一下之前的代码,下断点调试:

int _tmain(int argc, _TCHAR* argv[])
{
	string temp = "LYSM|LYSM|LYSM|LYSM";

	getchar();
	return 0;
}

在这里插入图片描述
在这里插入图片描述
留意红框内的数值,它是一个地址:0x005d95b0,转到这个地址看一下发现我们想要的数据就在这里!
在这里插入图片描述

总结:

(1)string 类型小于16字节时内存位置为 变量内存地址+4
(2)string 类型大于等于16字节时内存低地址为 [变量内存地址+4] ,也就是说原本存放在这里的数据变成了一个指针,32位进程(也就是我的)指针大小为4字节,64位进程指针大小为8字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值