STL——STL中string的写时拷贝机制

【C++STL基础入门】深入浅出string类的比较(compare)、复制(copy) 本系列STL使用VS2022+C++20版本在C++标准库中,string类是一个功能强大的字符串处理类,提供了丰富的操作函数。本文将详细介绍string类的比较、复制、查找字串、返回字串、交换等常用操作。通过深入浅出的解析,让读者对这些操作有更清晰的理解和掌握。本文深入浅出地介绍了string类的比较、复制常用操作。通过对这些操作的解析和示例,读者可以更加清晰地理解和掌握这些功能。熟练使用string类的操作函数,将有助于提高字符串处理的效率和代码质量,更好地应对实际开发需求。 阅读详情
string的写时拷贝机制是为了提高效率。STL中许多类都采用了该机制(Copy-on-Write),该技术确实使STL的程序有着比较高的效率。
string类中有一个私有成员变量char *ch,该变量指向该类从堆上分配的内存,其在构造的时候分配内存,在析构的时候释放内存。

写时拷贝的意思是:在例子中string str1 = "linux_ever"; string str2 = str1;可以看到str1和str2中的指针变量指向相同的内存地址。当改变str的内容的时候才拷贝该对象。

从程序的输出结果中看出:

string str1 = "linux_ever";执行完之后,str1对象的内容就是"linux_ever",会调用复制构造函数。

string str2 = str1;//执行完之后,会调用str2的复制构造函数,str2中的指针成员变量指向刚才str1中指向成员变量指向的内存单元。

当修改了str1的时候,就将str1的内存单元重新分配,将之前指向的内存单元中的内存拷贝过来,并修改相应的值。理所应当地,刚才的内存空间被str2单独占用了。所以接下来即使修改了str2的值,它的地址也没有发生改变。


在第二个程序中,先修改了str2,所以就将str2的内存单元重新分配,将之前指向的内存单元中的内存拷贝过来,并修改相应的值。理所应当地,刚才的内存空间被str1单独占用了。所以接下来即使修改了str1的值,它的地址也没有发生改变。


先修改str1,再修改str2:

/*************************************************************************
	> File Name: string_copy_on_write.cpp
	> Author: 
	> Mail: 
	> Created Time: 2016年03月25日 星期五 20时22分39秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;


int main()
{
    string str1 = "linux_ever";
    string str2 = str1;

    cout << "查看str1和str2中内容指向的地址: " << endl;

    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    cout << "\n输出两个string对象的值之后的内存地址:" << endl;
    cout << "str1 = " << str1 << endl;
    cout << "str2 = " << str2 << endl;
    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    cout << "\n修改了str1之后的地址:" << endl;
    str1[0] = 'u';
    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    cout << "\n修改了str2之后的地址:" << endl;

    str2[0] = 'w';
    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    return 0;
}

输出:



先修改str2,再修改str1:


/*************************************************************************
	> File Name: string_copy_on_write.cpp
	> Author: 
	> Mail: 
	> Created Time: 2016年03月25日 星期五 20时22分39秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;


int main()
{
    string str1 = "linux_ever";
    string str2 = str1;

    cout << "查看str1和str2中内容指向的地址: " << endl;

    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    cout << "\n输出两个string对象的值之后的内存地址:" << endl;
    cout << "str1 = " << str1 << endl;
    cout << "str2 = " << str2 << endl;
    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    cout << "\n修改了str2之后的地址:" << endl;
    str2[1] = 'u';
    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    cout << "\n修改了str1之后的地址:" << endl;

    str1[1] = 'w';
    printf("str1's address is %x\n", str1.c_str());
    printf("str2's address is %x\n", str2.c_str());

    return 0;
}
输出结果:




基于近场动力学的二维疲劳裂纹扩展模型_近场动力学数值模拟的程序实现(1)——引言... 参考书目W. H. Gerstle. 2015. Introduction to Practical Peridynamic: Computational Solid Mechanics Without Stress and Strain.E.Madenci, A.Barut, M.Dorduncu. Peridynamic Differential Operator for Numerical ... 阅读详情

相关推荐

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 592

关于c++中vector的push_back、拷贝构造copy constructor和移动构造move constructor

问题来自C++ Primer的第十三章练习题的13.48.是这样说的: 定义一个vector&lt;String&gt;并在其上多次调用push_back运行你的程序,并观察String被拷贝了多少次。 其中String是在习题中自己写的一个类似标准库string的类。(第一次看,自己写的String类确实有点挫,于是直接用了github上找到的CppPrimer答案中的String类。 ...

正善有的博客 5880

ShardingSphere-JDBC-若依框架集成(SpringBoot)

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架前后端版本、动态数据源,可自行切换,默认数据源为达梦8代理端,

编程小菜鸟的笔记 8168

通过STL中的string看写时拷贝和读时拷贝

之前的博客已经给出了如何自己定义一个string类,以及其内部应该有的操作,今天就让我们根据STL库中给出的string来看看,它重要的写实拷贝实现和一点点读时拷贝(也是写时拷贝)1、写时拷贝(copy-on-write)classString { public: String(constString&str) :_pData(NULL) { ...

weixin_34194379的博客 150

实战教程:用YOLOv11+PyQt5打造工地安全帽检测系统(附完整数据集)

本文提供了一份完整的实战指南,详细介绍了如何利用YOLOv11目标检测模型与PyQt5界面库,从零开始构建一个智能工地安全帽检测桌面应用。内容涵盖高质量数据集的准备与标注、YOLOv11模型训练与调优,以及如何使用PyQt5开发流畅、专业的图形用户界面,最终实现一个可实际部署的AI安全监控系统。

plum99的博客 736

全志平台camera驱动开发(3)MIPI接口camera驱动开发

详细沟通: 请加video_D 目前开发过的allwinner平台: V5/V3/V3S/V40/T3/T7/A64等 开发过的mipi sensor: sony:imx317、imx477、imx274、imx258、imx286、imx307、imx385等 ov:ov2718、ov12895、ov2710等 ar: ar0238等 国产:gc1024、gc1034...

jzwjzw19900922的博客 9027

关于STL中string的拷贝问题

简介在不同版本的STL中string类实现拷贝的方式也是不一样的。大致分为三种方式 eager copy(贪婪拷贝):这种情况是最简单粗暴的拷贝方式,也就是每个对象都是相互独立的,每次拷贝都是深拷贝。这种拷贝方式的缺点就是浪费空间,但是保证了每个对象的独立互不干扰。SSO(small string optimization,小字符串直接放在对象的栈空间中):这种拷贝方式对小字符串的处理很高效,一般

MBuger的博客 1601

RK3588开发笔记-ISP模块参数调试

本文详细介绍了基于RK3588平台的ISP模块参数调试流程。主要内容包括:硬件准备(RK3588板卡、IMX415摄像头等)、软件环境搭建(Ubuntu系统、RKISP_Tuner工具)、IMX415摄像头基础使用验证、RKISP2.x Tuner工具的使用方法(新建/加载IQ参数文件、Sensor配置、Raw图采集)以及最终IQ文件的部署。文章重点强调了基础标定的重要性,建议开发者分场景调试并参考官方文档,通过合理配置ISP参数来优化图像质量。该调试流程适用于RK3588平台的图像采集类项目开发。

flypig has a dream! 834

String类的深浅拷贝以及写时拷贝

c++复习

hou19975418的博客 974

YOLO11后处理优化 | 引入DIoU-NMS替代传统NMS,解决高重叠目标误删,召回率大幅提升

YOLO11模型在密集目标场景下存在NMS后处理导致的漏检问题。本文提出采用DIoU-NMS替代传统NMS,通过引入中心点距离信息,有效区分重叠但不同的目标,提升召回率。文章详细分析了传统NMS的三大局限性,对比了Soft-NMS和DIoU-NMS的优劣,并给出在YOLO11中实现DIoU-NMS的完整代码方案。该方法特别适用于安防监控、自动驾驶等目标密集场景,能够在不显著增加计算量的情况下显著改善检测效果。

2601_95807009的博客 150

Qt基础之十九:进程与QProcess

进程就是一个程序的执行实例,也就是正在运行的程序。对操作系统来说,进程就是一个担当分配系统资源CPU时间、内存的实体。在Qt 中,我们使用QProcess来表示一个进程。这个类可以允许我们的应用程序启动一个新的外部程序,并且与这个程序进行通讯。当外部程序开始启动时,QProcess的状态为Starting;外部程序已经启动时,QProcess的状态为Running,并发送started()信号;当外部层序退出了,QProcess的状态为NotRunning(初始状态),并发送finished()信号。

草上爬的博客 1万+

C++ STL:string类拓展|现代写法|SBO|写时拷贝|to_string

文章摘要:本文介绍了C++中string类的现代实现方法,对比了传统写法与现代写法的主要区别。现代写法通过临时对象交换实现拷贝构造和赋值重载,代码更简洁高效。同时探讨了小缓冲区优化(SBO)技术,以及写时拷贝(Copy-On-Write)机制的特点和局限性。最后指出现代编译器已放弃写时拷贝方案,因其在多线程环境下维护引用计数成本高,且C++11引入的移动语义提供了更好的优化方案。

分享C,C++,数据结构,Linux,算法内容 569

G.6 PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】

百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]_汀、的博客-优快云博客PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】_汀、的博客-优快云博客 PaddleHub--{超参优化AutoDL Finetuner}【二】_汀、的博客-优快云博客PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】_汀、的博客-优快云博客通过前面几篇文章大家都有一定了解,下面

丨汀、的博客 6185

c++写时拷贝

(Copy-On-Write)写时拷贝技术主要时为提高STL的效率而诞生的(这里的写时拷贝有点类似于linux上父子进程之间共享代码数据时的写时拷贝),从string类开始说明 #include<stdio.h> #include<string> using namespace std; int main() { string str1 = "hello world"; ...

weixin_43688483的博客 279

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c++中string的cow机制以及其为何在cpp11后不再被支持

本文起因 今天学习《Effective STL》的时候看到条款15,里面提到了有些stl的string实现里可能会有RefCount字段做引用计数,在实验相关内容后发现该字段已经在c++11中被废弃,为了琢磨明白为什么会废弃,进行了一番搜索,最后整理为本文。 RefCount介绍 书中介绍的一种string实现如下图。 其中RefCount字段是为了在copy string对象时避免直接重新分配内存,并拷贝字符串数据而设计的。比如在下面这段代码中,str2在赋值时拷贝了str1的数据,但实际上s

x670127565的博客 2750

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

探秘写时拷贝的真相发布啦!

导读 写时拷贝(copy-on-write, COW)就是等到修改数据时才真正分配内存空间,这是对程序性能的优化,可以延迟甚至是避免内存拷贝,当然目的就是避免不必要的内存拷贝。 什么是写时拷贝 其实我们对写时拷贝并不陌生,Linux fork和STL string是比较典型的写时拷贝应用,本文只讨论STL string的写时拷贝。 string类的实现必然有个cha

郑帅的博客 387

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

std::string的内存共享和Copy-On-Write 模式

写时才拷贝(Copy-On-Write)技术,就是编程界“懒惰行为”——拖延战术的产物。举个例子,比如我们有个程序要写文件,不断地根据网络传来的数据写,如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操作的话,都简直就是性能上巨大的损失,因此通常的做法是,每次写文件操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上(这就是为什么如果文件不关闭,所写的东西

Rigel7的专栏 480

string类、不同编译器下string类的差异、写时拷贝与引用计数

本文摘要:STL是C++标准模板库的核心组件,包含数据结构和算法框架。auto关键字用于自动类型推导,但需注意使用限制。范围for循环简化了数组和容器的遍历操作。string类提供了丰富的字符串操作功能,包括构造、访问、修改等操作,并介绍了VS和g++下的不同实现结构。最后讨论了写时拷贝和引用计数机制,这种优化策略通过延迟拷贝提升性能,但现代C++已弃用该技术。

深入探究的博客 829

c++ STL string的引用计数

STL string的引用计数,多个通过拷贝构造和复制操作具有相同值的string共享一块内存,由引用计数该参数保存共享内存的string个数, 通过写时拷贝防止修改共享内存的值. 但是,如果强制转换可能会引起共享内存被修改,例如 std::string str1 = "共享内存";...

287

Re:从零开始的 C++ STL篇(三)string的疑难问题详细解析:深拷贝,写时拷贝,三个swap

摘要:本文深入探讨C++ string类的底层实现与优化技术。重点分析了深拷贝的两种实现方式(传统写法和现代写法),对比了三种swap方法(通用模板、成员函数和特化版本)的性能差异。文章还介绍了引用计数与写时拷贝技术,比较了VS和g++下string的不同内存结构。最后讨论了常用转换接口和构造函数实现的注意事项,帮助开发者更深入理解string类的实现原理和优化技巧。

小此方的博客 736

*C++:string

标准模板库是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

Early_East_Moon的博客 888

STL string 源码深度解析

本文深入解析C++ STL中string类的实现原理,重点分析三种核心版本:纯净三指针版、SSO短字符串优化版和COW写时拷贝版。纯净版采用三个指针管理堆内存,实现高效O(1)操作;SSO版通过联合体实现短字符串栈存储,减少堆内存开销;COW版通过引用计数实现写时拷贝,优化只读场景性能。文章详细对比了各版本的内存布局、核心接口实现和适用场景,并提供了完整的工业级代码实现,包括构造函数、内存管理、扩容策略等关键细节。三种版本在保持接口一致性的同时,针对不同应用场景进行了极致优化,体现了STL设计的高效与灵活性

m0_62807361的博客 975

STL讲解(二)—string类的模拟实现

模拟实现string

roguexue的博客 913

C++ string类

本文系统介绍了C++标准模板库(STL)中的string类及其核心概念。主要内容包括:1. STL六大组件(容器、算法、迭代器等)和C++11特性(auto、范围for);2. string类的基本操作(构造、容量管理、查找修改等接口);3. 深浅拷贝原理及现代/传统实现方式;4. VS环境下string的内存结构分析;5. 完整模拟实现string类的过程,包含头文件声明和源文件实现。重点剖析了string类的底层设计思想、资源管理机制及性能优化策略,通过代码示例演示了如何避免浅拷贝问题,并对比了不同实现

naobeng的博客 1276

深入浅出C++ ——string类深度剖析

STL是C++标准库的重要组成部分,提供了常用的数据结构和算法实现。string类是STL中表示字符串序列的类,具有类似容器的接口,支持多种遍历方式(下标、迭代器、范围for)和容量操作(size、resize、reserve等)。string类通过basic_string模板实现,能高效处理字符序列,但仅支持单字节字符。其常用接口包括构造、拷贝、赋值、迭代器访问以及容量管理功能,为字符串操作提供了便捷的面向对象方法。使用string类需包含<string>头文件。

weixin_55051736的博客 890

C++STL容器——string和模拟实现

5 auto。

2501_94340515的博客 186
上一篇: STL——STL中vector的实现原理
下一篇: 深入剖析 linux GCC 4.4 的 STL string
readyao
博客等级 码龄11年 243粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值