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

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

个人主页: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不就被影响了吗?所以此时会发生写时拷贝,谁写入数据,操作系统就会为其分配一块新的空间,并使指针指向新的空间,将旧数据拷贝过来。

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


本篇讲解就到这里了。

目录
相关文章
|
1月前
|
C++ 容器
|
23天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
261 3
|
1月前
|
C++ 容器
|
1月前
|
C++ 容器
|
1月前
|
存储 C++ 容器
|
21天前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
14 0
|
1月前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
47 0
|
1月前
|
存储 编译器 程序员
深度剖析C++string(上篇)(2)
深度剖析C++string(上篇)(2)
35 0