值传递过程中的开销

当处理很大的字符串时,按值传递和按引用传递的区别会更加明显。让我们详细介绍一下字符串的拷贝过程以及占用的内存情况。

字符串按值传递

当你按值传递一个大字符串时,会发生以下过程:

  1. 创建临时副本

    • 在函数调用时,创建字符串对象的临时副本。这意味着整个字符串数据都会被复制一遍。
  2. 调用构造函数

    • 临时副本被传递到构造函数中。构造函数接收这个副本并初始化其成员变量。
  3. 释放临时副本

    • 临时副本在函数调用结束后会被销毁,释放内存。

假设有一个字符串str,长度为N,则:

  • 内存占用:原始字符串 str 占用 N + 1 字节(包括终止符 \0)。
  • 临时副本占用:N + 1 字节。
  • 总内存占用:2 * (N + 1) 字节(原始字符串和临时副本)。

字符串按引用传递

当你按引用传递一个大字符串时,会发生以下过程:

  1. 引用传递

    • 在函数调用时,仅传递字符串的引用(通常是指向字符串对象的指针)。
  2. 调用构造函数

    • 构造函数接收引用,并使用这个引用直接访问原始字符串数据。

假设有一个字符串str,长度为N,则:

  • 内存占用:原始字符串 str 占用 N + 1 字节。
  • 传递引用的指针占用:4 或 8 字节(根据系统的指针大小)。

总内存占用:N + 1 字节 + 指针大小(4 或 8 字节)。

示例代码对比

#include <iostream>
#include <string>class Person {
public:std::string name;// 按值传递Person(std::string name) : name(name) {}// 按引用传递Person(const std::string& name) : name(name) {}
};int main() {std::string large_string(1000000, 'a'); // 创建一个长度为1000000的字符串// 按值传递Person person1(large_string);// 按引用传递Person person2(large_string);return 0;
}

拷贝过程的详细说明

按值传递
  1. Person person1(large_string);:
    • 创建large_string的副本。
    • large_string包含1000000个字符加上一个终止符,共1000001字节。
    • 创建临时副本也需要1000001字节。
    • 构造函数内部初始化this->name,再进行一次拷贝,共用内存为1000001字节。

总共占用内存:

  • 原始字符串:1000001字节
  • 临时副本:1000001字节
  • 对象成员变量:1000001字节
  • 总计:3 * 1000001字节 ≈ 3MB
按引用传递
  1. Person person2(large_string);:
    • 仅传递large_string的引用(指针)。
    • 构造函数内部直接引用原始字符串数据进行初始化,不产生额外的字符串副本。

总共占用内存:

  • 原始字符串:1000001字节
  • 传递引用:4或8字节
  • 对象成员变量:指向原始字符串的指针
  • 总计:1000001字节 + 4/8字节 ≈ 1MB(略微增加)

总结

对于大字符串:

  • 按值传递会造成大量的内存复制,增加内存占用和复制开销。
  • 按引用传递则避免了不必要的拷贝,仅需传递指针,节省内存和时间。

因此,在处理大字符串时,按引用传递是更高效的选择。

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

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

相关文章

完全背包(从二维数组到一维滚动数组)

完全背包 二维dp数组完全背包1. 确定dp数组以及下标的含义2. 确定递推公式3. dp数组如何初始化4. 确定遍历顺序5. 举例推导dp数组完整代码: 一维滚动dp数组完全背包1.确定dp数组以及下标的含义2. 确定递推公式3. dp数组如何初始化4. 确定遍历顺序5. 举例推导dp数组完整代码&…

填充每个节点的下一个右侧节点Ⅱ-力扣

本题如果使用BFS去层序遍历&#xff0c;代码和 填充每个节点的下一个右侧节点 题没有任何区别。但是使用已经建立好的next链表去做&#xff0c;则需要考虑到next指向的节点子节点是否为空的可能。 class Solution { public:Node* connect(Node* root) {if(root nullptr){retu…

城镇污水处理设施运维服务认证

初次申请认证时需提交的文件/资料 1、通用文件/资料(证明文件复印件需签字盖公章) ☐ 营业执照复印件、统一社会信用代码/组织机构代码证复印件 ☐ 增值税一般纳税人资格证复印件&#xff0c;或其他增值税一般纳税人资格认定文件复印件 ☐ 资质 或 许可证 复印件&#x…

RT-Thread

RT-Thread RT-Thread 版权属于上海睿赛德电子科技有限公司&#xff0c;于 2006年 1月首次发布&#xff0c;初始版 本号为0.1.0&#xff0c;经过 10来年的发展&#xff0c;如今主版本号已经升级到3.0&#xff0c;累计开发者达到数百万&#xff0c; 在各行各业产品中装机量达到了…

C++ 并发编程指南(5)线程状态及切换

文章目录 一、多线程状态及切换1、线程状态2、状态切换 前言&#xff1a; C中的线程状态及切换是操作系统和C线程库&#xff08;如POSIX线程或C11及之后的<thread>库&#xff09;共同管理的。线程的状态和切换是多线程编程中的重要概念&#xff0c;下面将简要介绍C线程的…

大数据的数据变换与价值提炼

大数据的数据变换与价值提炼是指将原始的大数据进行分析和处理&#xff0c;从中提取出有用的信息和洞察&#xff0c;并转化为可以支持决策和创新的价值。这个过程通常包括以下几个步骤&#xff1a; 数据清洗和整理&#xff1a;原始的大数据通常会包含大量的噪音和冗余信息&…

大模型SFT

简介 supervised fine-tuning的缩写&#xff0c;即有监督的微调。如应用到一个新的场景&#xff0c;就可以使用SFT 开发流程 设计prompt选取llm模型制作数据集&#xff0c;子任务1k就可以了。内容要丰富。风格格式统一&#xff1b;尽量不加入新知识SFT微调 疑问 SFT很难学…

【Linux取经路】守护进程

文章目录 一、前台进程和后台进程二、Linux 的进程间关系三、setsid——将当前进程设置为守护进程四、daemon——设置为守护进程五、结语 一、前台进程和后台进程 Linux 中每一次用户登录都是一个 session&#xff0c;一个 session 中只能有一个前台进程在运行&#xff0c;键盘…

国产工业级实时数据库

项目功能描述 Mars数据库的核心功能在于其能够高效地处理来自工业现场的大量传感器数据。它通过简化的可视化配置&#xff0c;允许用户轻松接入各种传感器&#xff0c;并进行数据记录和逻辑处理。Mars数据库在单机模式下支持高达120万个传感器信号的接入&#xff0c;而其分布式…

Python Excel 指定内容修改

需求描述 在处理Excel 自动化时,财务部门经常有一个繁琐的场景,需要读取分发的Excel文件内容复制到汇总Excel文件对应的单元格内,如下图所示: 这种需求可以延申为,财务同事制作一个模板,将模板发送给各员工,财务同事需收取邮件将员工填写的excel文件下载到本机,再类似…

Java Web学习笔记15——DOM对象

DOM&#xff1a; 概念&#xff1a;Document Object Model&#xff1a; 文档对象模型 将标记语言的各个组成部分封装为对应的对象&#xff1a; Document: 整个文档对象 Element&#xff1a;元素对象 Attribute&#xff1a; 属性对象 Text&#xff1a;文本对象 Comment&a…

c++11 constexpr关键字

constexpr 是 C11 引入的一个关键字&#xff0c;它允许在编译时计算表达式的值&#xff0c;并将这些值存储在程序的常量部分中。这意味着 constexpr 变量和函数可以在编译时进行求值&#xff0c;从而避免了运行时的开销。 constexpr变量 constexpr 变量必须在编译时初始化&am…

如何使用ChatGPT写出爆款自媒体短视频文案

一、引言 自媒体时代&#xff0c;短视频的爆款文案往往能决定内容的传播效果。在众多工具中&#xff0c;ChatGPT以其强大的语言模型和多样化的应用场景&#xff0c;成为创作者的得力助手。今天我将分享如何使用ChatGPT来撰写引人注意的短视频文案&#xff0c;助你的内容一飞冲…

【Linux取经路】信号的发送与保存

文章目录 一、重新理解发送信号二、信号的保存、阻塞信号的概念三、信号集操作函数3.1 sigprocmask3.2 sigpending 四、阻塞信号代码验证五、结语 一、重新理解发送信号 进程通过位图来实现对普通信号&#xff08;1-31号信号&#xff09;的保存&#xff0c;该位图保存在进程的…

冯喜运:6.7今日黄金原油行情分析及独家操作策略

【黄金消息面分析】&#xff1a;周三&#xff08;6月5日&#xff09;&#xff0c;金价回升逾1.2%&#xff0c;收盘报每盎司2,355.49美元&#xff0c;全面收复前一交易日的跌幅。周三当天前公布的美国民间就业数据弱于预期&#xff0c;增强了美联储将在今年晚些时候降息的预期&a…

多表连接查询和子查询

一、连接查询 连接查询是SQL语言最强大的功能之一&#xff0c;它可以执行查询时动态的将表连接起来&#xff0c;然后从中查询数据。 1.1、连接两表的方法 在SQL中连接两表可以有两种方法&#xff0c;一种是无连接规则连接&#xff0c;另一种是有连接规则连接。 无连接规则连…

PbootCms微信小程序官网模版/企业官网/社交电商官网/网络工作室/软件公司官网

在数字化时代&#xff0c;企业网站已成为吸引潜在客户、提升企业形象、和扩大品牌影响力的必备工具。因此&#xff0c;一个优秀的企业网站模板显得尤为重要。 企业官网的内容框架通常都包含企业形象、产品或服务类型、信息展示等部分&#xff0c;设计师需要借助和企业形象契合…

初学者如何对大模型进行微调?

粗略地说&#xff0c;大模型训练有四个主要阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练消耗的时间占据了整个训练pipeline的99%&#xff0c;其他三个阶段是微调阶段&#xff0c;更多地遵循少量 GPU 和数小时或数天的路线。预训练对于算力和数据的要求非…

【vue3|第6期】如何正确地更新和替换响应式对象reactive

日期&#xff1a;2024年6月5日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测 目录 区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现QRCNN-GRU-…