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

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


本篇讲解就到这里了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/215444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea java 创建 hellword 项目

1.概要 建立一个最简单的工程,开始编码。 2.试验过程 2.1 创建的过程很简单,除了第一个窗口选择“java 模块”,其他的都是下一步。 2.2 还有就是刚创建的工程什么都没有需要,自己创建一个启动的类和启动函数。 2.3 运行和运行…

Java 内部类详解

目录 一. 前言 二. Java 类的创建要求 三. Java 内部类分类 3.1. 成员内部类 3.1.1. 特点 3.1.2. 语法 3.1.3. 代码示例 3.1.4. 代码测试 3.1.5. 关于 this 的注意事项 3.1.6. 小结 3.2. 局部内部类 3.2.1. 特点 3.2.2. 语法 3.2.3. 代码示例 3.2.4. 代码测试 …

宋仕强论道之华强北精神和文化(二十一)

宋仕强论道之华强北精神和文化(二十一): 华强北的精神会内化再提炼和升华成为华强北文化,在外部会流传下去和传播开来。在事实上的行动层面,就是华强北人的思维方式和行为习惯,即见到机会就奋不顾身敢闯敢赌…

C和C++的发展历史以及它们知识背景介绍

C和C发展历史 C语言 C语言是由贝尔实验室的丹尼斯里奇在20世纪70年代初期开发的。C语言最初被设计用于UNIX操作系统的开发,但后来被广泛用于其他各种领域和应用程序的编写。C语言是一种结构化编程语言,具有强大的底层系统编程能力,被广泛用…

pycharm多线程报错的问题(未解决)

暂未解决! 看了一下可能是这里的问题: 根据建议,在walks之前加了 freeze_support() 但是没有效果。 关键是,在jupyter上运行是没有问题的! 未解决。

js-过滤制表符

过滤所有不可见字符 var str"\n\t\n\t\t\t\r提问:亦庄上海沙龙房子保值吗" var reg /[\s]/g var re str.replace(reg,) console.log(re) console.log(JSON.stringify(re)) g全局匹配,默认只匹配一次 参考 JS——正则表达式(超…

算法-05-二分查找

二分查找(Binary Search)算法,也叫折半查找算法,是一种针对有序数据集合的查找算法。 1-二分查找的思想 我们生活中猜数字的游戏,告诉你一个数据范围,比如0-100,然后你说出一个数字&#xff0c…

工业相机与镜头选型方法(含实例)

一、相机介绍及选型方法 1.工业相机介绍 工业相机与我们手机上面的相机或者我们单反相机不同,工业相机它能够使用各种恶劣的工作环境,比如说高温,高压,高尘等。工业相机主要有面阵相机和线阵相机,线阵相机主要用于检测精度要求很高,运动速度很快的场景,而面阵相机应用…

Leetcode刷题详解——字符串中的第一个唯一字符

1. 题目链接:387. 字符串中的第一个唯一字符 2. 题目描述: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 示例 1: 输入: s "leetcode" 输出: 0示…

spring 属性注入 @Autowired和@Resource注解使用

众所周知Resource 和 Autowired两大注解是开发中最常用的两大注解。两者有一定的区别: Autowired Autowired是spring框架提供的注解类,默认按照类型进行装配。当在容器中找不到对应类型的bean时会抛出NoSuchBeanDefinitionException异常,当…

C语言中的结构体成员赋值与访问详解

C语言中的成员赋值与访问 在C语言中,我们可以使用不同的方式对结构体变量的成员进行赋值和访问。本文将详细介绍这些方式,并通过具体的示例代码加以说明。 目录 使用strcpy_s函数赋值字符串直接赋值数字和浮点数结构体变量之间的赋值使用复合文字进行…

周周清(2)----踩坑日记

周一: 1.之前换了一个jdk,然后又改了很多东西,很乱,以至于很多项目都不能直接运行了,所以今天就将ideal删除并且更新版本到2022.3.3,并且重新将ideal里面的配置环境变量,以及jdk下载安装配置&a…

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品,和开源数据库OpenGauss之间又是什么样的关系,刚开始接触的时候是一头雾水,因此本文简要对比下二者的区别,以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…

WPF仿网易云搭建笔记(4):信息流控制之消息订阅

文章目录 专栏和Gitee仓库前言消息订阅最简单的案例简单用例父组件订阅子组件回调 结果 消息订阅机制消息token是A还是B?传递消息的载体。双重token重复订阅问题 结论 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 上一篇文章中,我们简单…

PHP基础(1)

PHP是一种服务器端脚本语言,是一种用于开发动态Web应用程序的最流行和广泛使用的语言之一。它的全称为“Hypertext Preprocessor”,是一种开源的、可嵌入HTML的脚本语言,可以嵌入到HTML中,也可以直接作为命令行脚本运行。PHP脚本在…

Java小案例-如果您的 Java 应用程序在不做任何事情时正在消耗 CPU,您如何确定它在做什么?

前言 我正在调用供应商的 Java API,在某些服务器上,JVM 在登录 API 后似乎进入了低优先级轮询循环(CPU 使用率为 100%)。其他服务器上的同一应用程序不会出现此行为。这发生在 WebSphere 和 Tomcat 上。环境设置起来很棘手&#…

DevOps搭建(四)-GitLab安装细步骤

在这里我们用docker安装 1、创建gitlab安装目录 mkdir -p /usr/local/docker/gitlab_docker 进入该目录 cd /usr/local/docker/gitlab_docker 2、下载gitlab镜像 docker pull gitlab/gitlab-ce:latest 3、创建docker-compose.yml vi docker-compose.yml 输入以下内容保…

理解 HTTP POST 请求:表单与 JSON 数据格式深入解析20231208

引言 在日常的 Web 开发中,理解 HTTP POST 请求的不同数据格式是至关重要的。这不仅有助于构建健壮的后端服务,还能确保与其他服务的有效沟通。本文将深入探讨 multipart/form-data 和 application/json,这两种常见的 POST 请求格式。 POST…

2023 年安徽省职业院校技能大赛高职组“软件测试”赛项样题

2023 年安徽省职业院校技能大赛 高职组“软件测试”赛项样题 目录 任务一:功能测试(45 分) 1、测试计划(5 分) 2、测试用例(15 分) 3、Bug 清单(20 分) 4、测试报告&…

Python 学习笔记之 networkx 使用

介绍 networkx networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用 networkx 中的 Graph Graph 的定义 Graph 是用点和线来刻画离散事物…