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,…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
