(C++)VS下sizeof(string(““))与linux-g++下sizeof(string(““))大小区别及原因剖析

38 篇文章 0 订阅

个人主页:Lei宝啊 

愿所有美好如期而遇


说明 

博主是x86平台,所以下面的结果是28;x64平台下是40,size_t变了,由int变long long。

接下来我们先来介绍 vs 下string的数据结构

我们可以看到有一个_Buf数组,这个数组的大小为16个字节,但是存有效元素个数为15,最后一位存\0,以及char*,int size,int capacity,共12字节,所以我们计算下来总28字节。

g++下为什么是8个字节呢?首先,linux下默认是64平台,所以我们也就知道其实这是个指针,他不存大小的空间吗?我们来看:

我们发现是存的,也就是说存在size和capacity去记录大小,那么他们在哪里呢?

那么什么是引用计数呢? 我们在拷贝stack或者string时,会发生深拷贝,但是如果我们采用浅拷贝,那么就会是这样:

那么当a和b析构时,这一块空间会被析构两次,程序也就崩了,所以引用计数就用在这里,g++下就是浅拷贝,这块空间每被引用一次,引用计数+1,当析构时,引用计数不为1,就减减,当他为1时,析构释放这块空间。

那么也许你会问,共用一块空间,那如果a要写入数据,b不就被影响了吗?所以此时会发生写时拷贝,谁写入数据,操作系统就会为其分配一块新的空间,并使指针指向新的空间,将旧数据拷贝过来。

这样做意义是什么呢?这样做是在赌,赌你不写入数据,只读,这样就省下资源了,就算要写入,最多也就是之前的样子,稳赚不赔。


本篇讲解就到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lei宝啊

觉得博主写的有用就鼓励一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值