要了解代码的内存消耗,最重要的是要知道你使用的编程语言的内存管理。不同语言的内存管理不同的编程语言有自己的内存管理方式。C/C++的内存堆空间的申请和释放完全由自己管理。Java依赖JVM进行内存管理。如果不了解jvm内存管理的机制,很可能因为一些错误的代码写法导致内存泄漏或者内存溢出。Python内存管理由私有堆空间管理,所有python对象和数据结构都存储在私有堆空间中。程序员无权访问堆,只有解释器可以。比如Python中一切皆对象,对内存操作进行了很好的封装,所以python的基本数据类型占用的内存会比存储纯数据类型占用的内存大很多。例如,我们都知道存储int数据需要四个字符。section,但是如果你用Python申请一个对象来存储数据,使用的空间远远大于四个字节。C++内存管理以C++为例介绍编程语言的内存管理。如果我们写C++程序,我们需要知道栈和堆的概念。程序运行所需的内存空间分为固定部分和可变部分,如下:固定部分的内存消耗不会随着代码运行而改变,可变部分是有变化的。更具体地说,C/C++编译的程序所占用的内存分为以下几个部分:栈区(Stack):由编译器自动分配和释放,存放函数参数值、局部变量值等,及其运行mode类似于数据结构中的栈。堆区(Heap):一般由程序员分配和释放,如果程序员不释放,未初始化的数据区可能在程序结束时被OS回收(UninitializedData):存放未初始化的全局变量和静态变量初始化数据区(InitializedData):存放初始化的全局变量和静态变量程序代码区(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都一样。而这也是面试官在面试的时候非常喜欢问的一个问题,那就是:为什么会有内存对齐?平台原因主要有两个原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,有的硬件平台只能在特定地址取到特定类型的数据,否则抛出硬件异常。为了使同一个程序在多个平台上运行,需要内存对齐。硬件原因:内存对齐后,CPU访问内存的速度大大提高。你可以看一下这段C++代码输出的每种数据类型的大小?structnode{intnum;charcha;}st;intmain(){inta[100];charb[100];cout<
