个人主页: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不就被影响了吗?所以此时会发生写时拷贝,谁写入数据,操作系统就会为其分配一块新的空间,并使指针指向新的空间,将旧数据拷贝过来。
这样做意义是什么呢?这样做是在赌,赌你不写入数据,只读,这样就省下资源了,就算要写入,最多也就是之前的样子,稳赚不赔。
本篇讲解就到这里了。