C语言如果变量全部在全局内存空间会怎么样
结论先行
- 应该根据内存使用的生命周期,选择合适的内存空间
- 应该尽量使用连续内存
- 如果不想在设计封装性上付出太多代价,全部放入全局空间也比较可取
| 空间类型 | 特点 |
|---|---|
| 全局空间 | 生命周期最久,空间连续,变量分配紧致,但存在浪费物理内存的风险 |
| 栈空间 | 临时生命周期,但仍具有类似全局空间连续内存、变量分配紧致的优势 。不过,空间大小受限 |
| 堆空间 | 建议临时生命周期使用,但在连续内存视角上存在劣势,易形成碎片。不过,如果空间类型使用正确,碎片问题并不大 |
| 临时生命周期内存,在不超过栈空间约束的情况下,可以考虑直接用栈空间 |
缘由
近段几乎有一股魔怔,想将全局空间内的某些大内存变量,给尽量放入栈空间、或次之放入堆空间,以利于全局空间仅有少部分共享数据。
此种想法,从系统以少量全局信息开始自举,以及设计上的封装性来看是非常好的,避免全局变量空间成为一个垃圾场,充满各种杂乱无章和飞线乱飞,让代码更容易被理解、维护。
但是,后来细细想想、根据已掌握的内存使用知识梳理了一下,这样做的实用价值并不算太大!
那么,让我们来聊聊这个问题 😃
推演
白话理论
- 机器结构倾向于临近访问,以利于
CPU缓存、避免缺页处理
-
- 缓存设计深入的、进一步的要求,则需要区分读写,进行读写分离,将读、写分块、分区存放,使得读内存区域具有
cache友好性
- 缓存设计深入的、进一步的要求,则需要区分读写,进行读写分离,将读、写分块、分区存放,使得读内存区域具有
- 无论全局空间、还是堆空间、栈空间,均在内存被真实访问的时间,才转化为物理内存占用
-
- 无论哪种空间使用方式,在内存使用生命周期大致相同的情况下,真实占用物理内存差距并不大,而真实内存才是最宝贵的
-
- 根据临时性的内存的生命周期,选择栈空间,或堆空间,相比较于全局空间,在真实内存占用量这块存在一定优势
- 虚拟内存空间与物理内存之间存在页表映射,倾向于页表数量比较少,甚至在必要场合使用
巨页技术
-
- 要尽量减少页表,最直接的要求就是申请量要少,甚至使用
巨页技术
- 要尽量减少页表,最直接的要求就是申请量要少,甚至使用
可以看到,以上内存使用约束带来的影响不同的,不见得都是正相关
如果变量全部在全局空间会怎么样
如果极端地变量使用内存全部存放在全局空间,那么除了设计上的劣势外,会具有一些什么好处呢?
- 空间连续,页表减少
- 变量分配紧致、内存碎片可能较少
- 在预防内存不足的场景具有相对优势
甚至由于在程序启动时,全局空间已由OS系统分配完毕,也就给OS在全局内存空间占用较多的时间,达到系统优化阈值之后,使用巨页的自动优化留下了空间。
不过,OS对全局空间占用比较大的场景,是否透明地采用巨页技术,仅是猜测,未经考证,但存在此种可能,看OS系统的进取心了!
补充劣势: 全局变量空间较大,笔者曾遇到
valgrind检测失败的情况
栈空间
栈空间在线程创建时即进行申请,根据ulimit -s的限定,相当于一块连续的大内存,也拥有全局空间的优势和变量分配的紧致,但却是临时生命周期内存空间的乐园。
- 使用技巧:在
main函数或Thread Entry函数入口处栈空间,与全局变量几乎具有同等的生命周期,而且具有良好的封装性
堆空间
因为堆空间内存申请、释放的时机,与内存大小的随机性,比较大可能存在内存碎片,建议对于典型、已知应用场景,使用拥有连续内存的用户自定义的内存分配器,进行管理。
内存碎片对于在堆空间存活时间长的内存空间比较敏感,如果内存空间都很临时,其实碎片的可能性也大为减小。
但,峰值场景值得警惕!
根据这个原则,开发者应对内存生命周期比较长的内存使用转化为全局空间,或用户自定义内存管理器所开辟的空间,避免形成内存碎片。
最后说点
虽然说针对于C 语言程序探讨问题,但我想因为C语言对于机器的优秀建模,所以,其它编程语言也大差不差。
对于此问题的认识来源于分析的方法:
- 抛出一个简单模型观察、观察
- 推演其极致情况,看看究竟
- 在理解和把握前两者之后,对混合情况进行分析、分析
相关文章:
C语言如果变量全部在全局内存空间会怎么样
结论先行 应该根据内存使用的生命周期,选择合适的内存空间应该尽量使用连续内存如果不想在设计封装性上付出太多代价,全部放入全局空间也比较可取 空间类型特点全局空间生命周期最久,空间连续,变量分配紧致,但存在浪…...
【YOLO改进】换遍MMPretrain主干网络之ConvNeXt-Tiny(基于MMYOLO)
ConvNeXt-Tiny ConvNeXt-Tiny 是一种改进的卷积神经网络架构,其设计目的是在保持传统卷积神经网络优势的同时,借鉴了一些Transformer架构的成功经验。 ConvNeXt-Tiny 的优点 架构优化: ConvNeXt-Tiny 对经典ResNet架构进行了多种优化&#…...
【数据库】MySQL
文章目录 概述DDL数据库操作查询使用创建删除 表操作创建约束MySqL数据类型数值类型字符串类型日期类型 查询修改删除 DMLinsertupdatedelete DQL基本查询条件查询分组查询分组查询排序查询分页查询 多表设计一对多一对一多对多设计步骤 多表查询概述内连接外连接 子查询标量子…...
JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解
文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC:并行回收4. Parallel GC:吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)使用命令行指令:ji…...
The Missing Semester of Your CS Education(计算机教育中缺失的一课)
Shell 工具和脚本(Shell Tools and Scripting) 一、shell脚本 1.1、变量赋值 在bash中为变量赋值的语法是foobar,访问变量中存储的数值,其语法为 $foo。 需要注意的是,foo bar (使用空格隔开)是不能正确工作的&…...
如何为ChatGPT编写有效的提示词:软件开发者的指南
作为一名软件开发者,特别是使用Vue进行开发的开发者,与ChatGPT等AI助手高效互动,可以极大地提升你的开发效率。本文将深入探讨如何编写有效的提示词,以便从ChatGPT中获取有用的信息和帮助。 1. 明确目标 在编写提示词之前&#…...
angular插值语法与属性绑定
在 Angular 中,您提供的两种写法都是用来设置 HTML 元素的 title 属性,但它们的工作方式有所不同: 插值语法 (Interpolation) <h1 title"{{ name }}">我的名字</h1> 属性绑定 (Property Binding) <h1 [title]&q…...
Python ❀ 使用代码解决今天中午吃什么的重大生存问题
1. 环境安装 安装Python代码环境参考文档 2. 代码块 import random# 准备一下你想吃的东西 hot ["兰州拉面", "爆肚面", "黄焖鸡", "麻辣香锅", "米线", "麻食", "羊肉泡馍", "肚丝/羊血汤&qu…...
做抖音小店需要清楚的5个核心点!
大家好,我是喷火龙。 不管你是在做抖音小店,还是在做其他的电商平台,如果已经做了一段时间了,但还是没有拿到什么结果,我所指的结果不是什么大结果,而是连温饱都解决不了,甚至说还在亏钱。 有…...
文件流下载优化:由表单提交方式修改为Ajax请求
如果想直接看怎么写的可以跳转到 解决方法 节! 需求描述 目前我们系统导出文件时,都是通过表单提交后,接收文件流自动下载。但由于在表单提交时没有相关调用前和调用后的回调函数,所以我们存在的问题,假如导出数据需…...
基础3 探索JAVA图形编程桌面:逻辑图形组件实现
在一个宽敞明亮的培训教室里,阳光透过窗户柔和地洒在地上,教室里摆放着整齐的桌椅。卧龙站在讲台上,面带微笑,手里拿着激光笔,他的眼神中充满了热情和期待。他的声音清晰而洪亮,传遍了整个教室:…...
前后端部署笔记
windows版: 如果傻呗公司让用win电脑部署,类似于我们使用笔记本做局域网服务器,社内使用。 1.安装win版的nginx、mysql、node、jdk等 2.nginx开机自启参考Nginx配置及开机自启动(Windows环境)_nginx开机自启动 wind…...
设计模式9——适配器模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式(Adapte…...
一文了解基于ITIL的运维管理体系框架
本文来自腾讯蓝鲸智云社区用户:CanWay ITIL(Information Technology Infrastructure Library)是全球最广泛使用的 IT 服务管理方法,旨在帮助组织充分利用其技术基础设施和云服务来实现增长和转型。优化IT运维,作为企业…...
Web前端开发技术-格式化文本 Web页面初步设计
目录 Web页面初步设计 标题字标记 基本语法: 语法说明: 添加空格与特殊符号 基本语法: 语法说明: 特殊字符对应的代码: 代码解释: 格式化文本标记 文本修饰标记 计算机输出标记 字体font标记 基本语法: 属…...
Windows下部署Seata1.5.2,解决Seata无法启动问题
目录 1. 版本说明 2. Windows下部署Seata1.5.2 2.1 创建回滚日志表undo_log 2.2 创建Seata服务端需要的四张表 2.3 在nacos创建seata命名空间,添加seataServer.yml配置 2.4 修改本地D:/tool/seata-server-1.5.2/seata/conf/applicaltion.yml文件 2.5 启动Seat…...
我加入了C++交流社区
最近,我决定加入了一个C交流社区,这是一个专注于C编程语言的在线平台。加入这个社区的初衷是为了提升我的编程技能,与其他对C感兴趣的人交流经验和知识。 加入这个社区后,我发现了许多有趣的讨论和资源。每天都有各种各样的话题&…...
Vue从入门到实战Day11
一、为什么要学Vue3 Vue3官网:简介 | Vue.js 1. Vue3的优势 2. Vue2选项式API vs Vue3组合式API 示例: 二、create-vue搭建Vue3项目 1. 认识create-vue create-vue是Vue官方新的脚手架工具,底层切换到了vite(下一代构建工具),为…...
day15|各种遍历的应用
相关题目: 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路:层次遍历二叉树,将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…...
第12周作业--HLS入门
目录 一、HLS入门 二、HLS入门程序编程 创建项目 1、点击Vivado HLS 中的Create New Project 2、设置项目名 3、加入文件 4、仿真 3、综合 一、HLS入门 1. HLS是什么?与VHDL/Verilog编程技术有什么关系? HLS(High-Level Synthesis,…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
