返回顶部
首页 > 资讯 > 精选 >如何理解代码的内存消耗么
  • 398
分享到

如何理解代码的内存消耗么

2023-06-15 15:06:14 398人浏览 泡泡鱼
摘要

本篇内容介绍了“如何理解代码的内存消耗么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不同语言的内存管理不同的编程语言各自的内存管理方式。C

本篇内容介绍了“如何理解代码的内存消耗么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

不同语言的内存管理

不同的编程语言各自的内存管理方式。

  • C/C++这种内存堆空间的申请和释放完全靠自己管理。

  • Java 依赖JVM来做内存管理,不了解jvm内存管理的机制,很可能会因一些错误的代码写法而导致内存泄漏或内存溢出。

  • python内存管理是由私有堆空间管理的,所有的Python对象和数据结构都存储在私有堆空间中。程序员没有访问堆的权限,只有解释器才能操作。

例如Python万物皆对象,并且将内存操作封装的很好,所以python的基本数据类型所用的内存会要远大于存放纯数据类型所占的内存,例如,我们都知道存储int型数据需要四个字节,但是使用Python  申请一个对象来存放数据的话,所用空间要远大于四个字节。

c++的内存管理

以C++为例来介绍一下编程语言的内存管理。

如果我们写C++的程序,就要知道栈和堆的概念,程序运行时所需的内存空间分为 固定部分,和可变部分,如下:

如何理解代码的内存消耗么

固定部分的内存消耗 是不会随着代码运行产生变化的, 可变部分则是会产生变化的。

更具体一些,一个由C/C++编译的程序占用的内存分为以下几个部分:

  • 栈区(Stack) :由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。

  • 堆区(Heap) :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS收回

  • 未初始化数据区(Uninitialized Data):存放未初始化的全局变量和静态变量

  • 初始化数据区(Initialized Data):存放已经初始化的全局变量和静态变量

  • 程序代码区(Text):存放函数体的二进制代码

代码区和数据区所占空间都是固定的,而且占用的空间非常小,那么看运行时消耗的内存主要看可变部分。

在可变部分中,栈区间的数据在代码块执行结束之后,系统会自动回收,而堆区间数据是需要程序员自己回收,所以也就是造成内存泄漏的发源地。

而Java、Python的话则不需要程序员去考虑内存泄漏的问题,虚拟机都做了这些事情。

如何计算程序占用多大内存

想要算出自己程序会占用多少内存就一定要了解自己定义的数据类型的大小,如下:

如何理解代码的内存消耗么

注意图中有两个不一样的地方,为什么64位的指针就占用了8个字节,而32位的指针占用4个字节呢?

1个字节占8个比特,那么4个字节就是32个比特,可存放数据的大小为2^32,也就是4G空间的大小,即:可以寻找4G空间大小的内存地址。

大家现在使用的计算机一般都是64位了,所以编译器也都是64位的。

安装64位的操作系统的计算机内存都已经超过了4G,也就是指针大小如果还是4个字节的话,就已经不能寻址全部的内存地址,所以64位编译器使用8个字节的指针才能寻找所有的内存地址。

注意2^64是一个非常巨大的数,对于寻找地址来说已经足够用了。

内存对齐

再介绍一下内存管理中另一个重要的知识点:内存对齐。

不要以为只有C/C++才会有内存对齐,只要可以跨平台的编程语言都需要做内存对齐,Java、Python都是一样的。

而且这是面试中面试官非常喜欢问到的问题,就是:为什么会有内存对齐?

主要是两个原因

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 平台原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。

  3. 硬件原因:经过内存对齐后,CPU访问内存的速度大大提升。

可以看一下这段C++代码输出的各个数据类型大小是多少?

struct node{    int num;    char cha; }st; int main() {     int a[100];     char b[100];     cout << sizeof(int) << endl;     cout << sizeof(char) << endl;     cout << sizeof(a) << endl;     cout << sizeof(b) << endl;     cout << sizeof(st) << endl; }

看一下和自己想的结果一样么, 我们来逐一分析一下。

其输出的结果依次为:

4 1 400 100 8

此时会发现,和单纯计算字节数的话是有一些误差的。

这就是因为内存对齐的原因。

来看一下内存对齐和非内存对齐产生的效果区别。

CPU读取内存不是一次读取单个字节,而是一块一块的来读取内存,块的大小可以是2,4,8,16个字节,具体取多少个字节取决于硬件。

假设CPU把内存划分为4字节大小的块,要读取一个4字节大小的int型数据,来看一下这两种情况下CPU的工作量:

第一种就是内存对齐的情况,如图:

如何理解代码的内存消耗么

内存对齐

一字节的char占用了四个字节,空了三个字节的内存地址,int数据从地址4开始。

此时,直接将地址4,5,6,7处的四个字节数据读取到即可。

第二种是没有内存对齐的情况如图:

如何理解代码的内存消耗么

非内存对齐

char型的数据和int型的数据挨在一起,该int数据从地址1开始,那么CPU想要读这个数据的话来看看需要几步操作:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 因为CPU是四个字节四个字节来寻址,首先CPU读取0,1,2,3处的四个字节数据

  3. CPU读取4,5,6,7处的四个字节数据

  4. 合并地址1,2,3,4处四个字节的数据才是本次操作需要的int数据

此时一共需要两次寻址,一次合并的操作。

大家可能会发现内存对齐岂不是浪费的内存资源么?

是这样的,但事实上,相对来说计算机内存资源一般都是充足的,我们更希望的是提高运行速度。

编译器一般都会做内存对齐的优化操作,也就是说当考虑程序真正占用的内存大小的时候,也需要认识到内存对齐的影响。

“如何理解代码的内存消耗么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何理解代码的内存消耗么

本文链接: https://lsjlt.com/news/280758.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解代码的内存消耗么
    本篇内容介绍了“如何理解代码的内存消耗么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不同语言的内存管理不同的编程语言各自的内存管理方式。C...
    99+
    2023-06-15
  • php内存消耗大怎么解决
    这篇文章给大家介绍php内存消耗大怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。php吃内存的解决办法:1、将memory_limit由8M改成16M;2、在PHP文件中加入“ini_set(”memory_l...
    99+
    2023-06-21
  • 详解分析MySQL8.0的内存消耗
    目录1、innodb_buffer_pool_size 2、innodb_log_buffer_size 1、查看2、在配置文件中写上相关的参数,开启统计,以memory/innod...
    99+
    2024-04-02
  • 如何理解Java代码的内存管理
    这期内容当中小编将会给大家带来有关如何理解Java代码的内存管理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。小编通过几个方面来介绍Java代码的内存管理。有的代码,GC根本就回收不了,直接系统挂掉。GC...
    99+
    2023-06-17
  • docker如何查看进程、内存、cup消耗的情况
    这篇文章将为大家详细讲解有关docker如何查看进程、内存、cup消耗的情况,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。docker 查看进程, 内存,cup 消耗启动 docker 容器,可以通过 d...
    99+
    2023-06-14
  • Linux系统中如何查看最消耗CPU内存
    这篇文章主要为大家展示了Linux系统中如何查看最消耗CPU内存,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Linux系统中如何查看最消耗CPU内存”这篇文章吧。1.CPU占用最多的前10个进程...
    99+
    2023-06-28
  • 破解谜底:Go语言的形参内存消耗
    go 语言中,函数参数按值传递,但指针参数例外,会修改指向的值并在调用者处反映。传递指针时,需要额外分配内存存储指针,可能导致内存消耗问题。可通过按值传递指针副本解决此问题,避免额外分配...
    99+
    2024-04-04
    go语言 形参内存消耗
  • 导致JVM物理内存消耗大的Bug是怎么样的
    导致JVM物理内存消耗大的Bug是怎么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。概述最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191...
    99+
    2023-06-05
  • Linux系统如何查看最消耗cpu内存的进程
    这篇“Linux系统如何查看最消耗cpu内存的进程”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Linux系统如何查看最消耗cpu内存的进程”,小编整理了以下知识点,请大家跟着小编的步伐一步一...
    99+
    2023-06-28
  • 怎么在Linux中找出内存消耗大的进程
    这篇文章主要讲解了“怎么在Linux中找出内存消耗大的进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在Linux中找出内存消耗大的进程”吧!1) 如何使用 ps 命令在 Linux ...
    99+
    2023-06-16
  • 如何进行C++代码的内存管理?
    如何进行C++代码的内存管理C++是一种功能强大的编程语言,但同时也要求程序员自行管理内存。正确的内存管理是确保程序运行稳定和高效的关键之一。本文将介绍一些常见的内存管理技术和最佳实践,帮助初学者和有经验的开发人员更好地管理C++代码的内存...
    99+
    2023-11-03
    内存释放 C++内存管理 C++内存分配
  • 怎么在Linux中找出内存消耗最大的进程
    这篇文章主要介绍了怎么在Linux中找出内存消耗最大的进程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1) 如何使用 ps 命令在 Linux 中查找内存消耗最大的进程ps...
    99+
    2023-06-16
  • 如何进行C++代码的内存优化?
    在C++的各种应用程序中,内存一直是一个重要的考虑因素。内存分配是C++编程中常见的操作,这些分配极大地影响了代码的性能。因此,进行内存优化是必不可少的。在本文中,我们将探讨使用一些常见的技巧来优化C++程序的内存使用。这些技巧包括可变数组...
    99+
    2023-11-02
    内存管理 内存分配 内存回收
  • C++技术中的内存管理:托管代码与非托管代码的内存管理差异
    c++++ 中托管与非托管代码的内存管理差异:托管代码由 clr 管理,非托管代码由操作系统管理。托管代码的内存分配和释放由 clr 自动执行,非托管代码需手动管理。托管代码采用垃圾收集...
    99+
    2024-05-08
    托管代码 非托管代码 c++
  • C++内存管理如何理解
    这期内容当中小编将会给大家带来有关C++内存管理如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言;C++继承了C语言的指针,一直以来指针的一些问题困扰着开发人员,常见的指针问题主要有:内存泄露、...
    99+
    2023-06-26
  • 如何解决PHP里大量数据循环时内存耗尽的问题
    本篇文章为大家展示了如何解决PHP里大量数据循环时内存耗尽的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。最近在开发一个PHP程序时遇到了下面的错误:PHP Fatal er...
    99+
    2023-06-17
  • RocketMQ Broker如何保存消息源码解析
    目录前言消息存储格式总览CommitLog介绍MappedFile详解消息存储格式介绍DefaultMessageStore介绍消息存储源码分析发送消息存储流程消息预处理阶段消息保存...
    99+
    2023-05-19
    RocketMQ Broker保存消息 RocketMQ Broker
  • 如何用Python代码减少Python所需的内存
    如何用Python代码减少Python所需的内存,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在执行程序时,如果内存中有大量活动的对象,就可能出现内存问题,尤其...
    99+
    2023-06-02
  • 如何理解Linux进程的内存管理
    这篇文章给大家介绍如何理解Linux进程的内存管理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。几个关键的数据结构一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_str...
    99+
    2023-06-15
  • 如何理解Typescript代码
    这篇文章主要介绍“如何理解Typescript代码”,在日常操作中,相信很多人在如何理解Typescript代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Type...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作