【每日 C/C++ 问题】

一、C++函数的返回值在内存中的传递过程

1. 按值返回

        当函数按值返回时,返回值会在栈上进行复制。整个过程如下:当函数被调用时,会在调用栈上维护一个独立的栈帧空间,相关的参数和局部变量在栈上分配内存。函数内部计算返回值,并将结果存储在它自己的栈帧中。当函数执行到 return 语句时,返回值将被复制到调用函数的栈帧中。此时,编译器可能会将返回值用调用函数栈帧中的一个临时变量来接收这个返回值。函数返回后,调用的栈帧将被清理(栈指针向下移动),局部变量的内存被释放。

2. 按引用返回

        当函数按引用返回(即返回一个引用或指向存储在某处的对象的指针)时,返回的内存地址将被直接使用,而不是复制值。这种方式不会引入额外的复制成本,但在使用时需要小心,尤其要确保引用的生命周期有效,例如不能返回局部变量的引用,可以返回静态局部变量的引用,因为一旦函数返回,局部变量的内存将被释放,返回的引用将指向一块无效的内存。与按值返回相同,参数和局部变量会在栈上分配内存。当执行到 return 语句时,程序实际上返回了变量或对象的内存地址。调用者可以通过此地址直接访问 。

        栈中分配了变量或对象的空间。函数返回时,返回的是一个指向该变量或对象 的引用(即它的内存地址)。

二、 什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗

虚拟内存

        进程中只能访问虚拟内存地址,操作系统会把虚拟内存地址翻译成真实的内存地址,这种内存管理方式,称为虚拟内存。操作系统为每个进程分配一套独立的虚拟地址,每个进程访问自己的虚拟地址,互不干涉,操作系统会提供将虚拟内存地址和物理地址映射的机制。如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。

虚拟内存有以下几个重要的作用和好处:

  1. 扩展可用内存: 虚拟内存使得每个进程可以访问比物理内存更大的内存空间。当物理内存不足时,虚拟内存可以将一部分不常用的数据暂时存储在磁盘上,以释放出物理内存供其他进程使用。这样,系统能够同时运行更多的程序,提升了系统的整体运行能力。
  2. 进程隔离和保护: 虚拟内存为每个进程提供了独立的地址空间,使得进程之间相互隔离。这样,一个进程不能直接访问其他进程的内存空间,保护了进程的数据和代码的安全性。如果一个进程出现了异常或崩溃,只会影响到该进程本身,而不会对其他进程造成影响。
  3. 简化内存管理: 虚拟内存使得内存管理更加简化。操作系统可以在物理内存和磁盘之间进行数据交换,将内存调度和分配操作集中在物理内存上,而不需要关心具体的物理地址。这样简化了内存分配和释放的操作,提高了内存管理的效率。
  4. 内存共享和进程通信: 虚拟内存允许多个进程共享同一部分内存,这样不同的进程可以轻松地共享数据和信息,实现进程间的通信和协作。例如,多个进程可以共享同一块内存区域,实现高效的数据交换和共享资源

总而言之,虚拟内存为系统提供了更高的内存使用效率、更好的进程隔离和保护、更简化的内存管理以及使得操作系统能够更好地更灵活的进程通信等好处,运行和管理多个应用程序。

        同时,虚拟内存可以大于物理内存虚拟内存也提供了一种内存扩展机制,使得系统能够运行更多的程序,而不会因为物理内存不足而导致程序崩溃。举个例子来说,假设一个系统有4GB的物理内存和一个 32 位的进程。虚拟内存可以将这个进程的地址空间分为多个页面 (通常是4KB一组) 。当进程需要访问某个页面时,操作系统会将其加载到物理内存中并更新进程的页表,如果物理内存不足,则可能需要将某些不常用的页面置换出来,供其他进程使用。这样,每个进程都能够拥有4GB的地址空间,而不受实际物理内存容量的限制。

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享

一、背景特殊医学用途配方食品简称特医食品,是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要,专门加工配置而成的配方食品,包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…

【MYSQL】数据库日志 (了解即可)

一、错误日志 可以通过 tail查看文件的日志的,如果发生错误,就会在日志里出现问题。 二、二进制日志(binlog) BINLOG记录了insert delete update 以及 alter create drop 等语句。作用是灾难时的数据恢复,还有就是主…

STM32 创建一个工程文件(寄存器、标准库)

首先到官网下载对应型号的固件包: 像我的STM32F103C8T6的就下载这个: 依次打开: .\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 可以看到: 这…

C语言 char 字符串 - C语言零基础入门教程

目录 一.char 字符串简介 二.字符和字符串区别 1.取值范围相同2.字符串由多个字符构成3.字符串和字符使用 printf 函数 三.char 字符串遍历四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.char 字符串简介 在C 语言中,除了前面介绍…

Python——NumPy库的简单用法,超级详细教程使用

一、什么是NumPy库 NumPy:它是python的一个科学计算库函数,它是由c语言编写的 它应用于数据处理、机器学习、图像处理、文件操作等等 二、array函数 这里导入库numpy,命名为np,后面的np都是代表着是numpy函数 array函数表示创建…

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num:{num}\nnum数据类型为:{type(num)}") # 求集合中元素个数 print(f"num中元素个数为:{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

【数字图像处理+MATLAB】基于 Sobel 算子计算图像梯度并进行边缘增强:使用 imgradientxy 函数

引言 在图像处理中,边缘通常是图像中像素强度变化最大的地方,这种变化可以通过计算图像的梯度来量化。梯度是一个向量,它的方向指向像素强度增加最快的方向,它的大小(或者说幅度)表示像素强度增加的速度。…

从社交媒体到元宇宙:Facebook未来发展新方向

Facebook,作为全球最大的社交媒体平台之一,已经从最初的简单互动工具发展成为一个跨越多个领域的科技巨头。无论是连接人与人之间的社交纽带,还是利用大数据、人工智能等技术为用户提供个性化的体验,Facebook一直引领着社交网络的…

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 二、开发者工具的使用1创建项目2 工具的使用3目录结构4各个页面之间的关系5 权限管理6提交审核和发布 一、开发前的准备 开发前需要进行以下准备: 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后…

SQL慢查询优化方式

目录 一、SQL语句优化 1.避免使用 SELECT * ,而是具体字段 2.避免使用 % 开头的 LIKE 的查询 3.避免使用子查询,使用JOIN 4.使用EXISTS代替IN 5.使用LIMIT 1优化查询 6.使用批量插入、优化INSERT操作 7.其他方式 二、SQL索引优化 1.在查询条件…

【51单片机】LCD1602液晶显示屏

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602(Liquid Crystal Display)液晶显示屏是…

git入门环境搭建和gui使用

git下载 git官网地址:https://git-scm.com/ 如果没有魔法的话,官网这个地址能卡死你 这里给个国内的git镜像链接 git历史版本镜像链接 然后一路next 默认路径 默认勾选就行。 今天就写到这吧,11点多了该睡了,,&#…

python调用MySql详细步骤

一、下载MySql MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/windows/installer/8.0.html点击上面链接,进入MySQL8.0的下载页面,选择离线安装包下载。 不需要登陆,直接点击下方的 No thanks,just start my download. …

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 select 语句是 Go 的一种控制结构,用于等待多个通道操作。它类似于 s…

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

C++数据结构算法学习

C ,orient(面向) object , object entity(实体) Visible(可见的) or invisible(不可见) 变量用来保存数据 objects attribute(属性) services(服务) C STL 容器 vector, list() vector底层是数组,类似双向链表和list底层 map/s…

基于Java Springboot图书馆管理系统

一、作品包含 源码数据库文档全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库:MySQL8.0 数据…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask,Django,其它 您可以挂载多个 WSGI 应用,正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

gdb调试redis。sudo

1.先启动redis-server和一个redis-cli。 2.ps -aux|grep reids查看redis相关进程。 3.开始以管理员模式附加进程调试sudo gdb -p 2968.注意这里不能不加sudo,因为Redis 可能以 root 用户启动,普通用户无法附加到该进程。否则就会出现可能下列情形&#…

Python安装(ubuntu)

一:安装指定版本的python python3 --version直接返回ubuntu自带的3.8.10的版本 radarswradarsw-Precision-5560:~$ python3 --version Python 3.8.10通过指令直接安装,会报错如下; radarswradarsw-Precision-5560:~$ sudo apt install python3.11 正在…