奇妙的内存分区

您所在的位置:网站首页 固态硬盘用mbr分区 奇妙的内存分区

奇妙的内存分区

2023-05-18 00:35| 来源: 网络整理| 查看: 265

内存是什么?

        内存,英文名Memory,他是计算机中必不可少的临时存储部件,也有人叫他内存储器或者主存储器,我一般叫他内存条,哈哈哈,,,(内存不一定是内存条才有的,有些是焊在板子上的,我们常说的内存一般都是内存条)内存的作用就是存放临时的数据,临时的数据一般是来自固态硬盘或者机械硬盘等存储设备(外存)的数据。说白了内存是外存和CPU等处理器之间沟通的桥梁,在计算机中所有程序都是在内存中运行的,所以说某种程度上内存的性能强弱影响计算机的整体性能。

这是一块某商家购买的内存条 ,容量为16GB,其由内存芯片和电路板、金手指等许多小零件组成,也是一个很精密的硬件。

敲重点!!!

我们写的程序运行起来之后,就会放到内存的空间里面,摇身一变就成了进程,为什么要这么说呢?因为程序是死的,而进程是活的,哈哈哈,程序是我们写的代码,放在固态硬盘或者机械硬盘等外存上的,而进程是放在内存中的,严肃点讲:进程是OS分配资源的基本单位,而程序是按照某种语法等编写的数据。

        在32位OS中,OS会为每一个进程分配最大为4G的内存空间,为啥呢?因为CPU的一次运算长度为32位,2^32==4G,而 在64位OS中,OS会为每一个进程分配最大为17179869184G的内存空间,我认为32位OS在内存空间利用率上比64位好点吧,虽然64位给进程发挥的空间更大,但是64位的指针是8字节的,而32位指针的4字节的,而且除了指针本身大小的浪费外,更大的指针在内存和三级缓存之间移动数据的时候也会占用更多的带宽。

以上是内存运行中的分区,程序运行之前,分区是代码区和BBS、Data区 ;

代码区就是存放我们写的程序,其特点是只读和共享;

BBS(block started by symbol)这里存放的是未初始化的数据;

data数据区,存放的自然是初始化的数据。

重点介绍程序运行的内存分区状态

直接上代码

#include #include #include // 地址为八进制或者16进制 // c语言中用字母加下划线连接 // c++中用驼峰式命名法则 // 全局变量 int g_a = 1; int g_b = 2; int g_c = 3; // 静态全局变量 static int s_g_a = 100; static int s_g_b = 200; static int s_g_c = 300; // 全局常量 const int c_g_a = 10; const int c_g_b = 20; const int c_g_c = 30; void test() { printf("全局变量g_a地址:%d\n", &g_a); printf("全局变量g_b地址:%d\n", &g_b); printf("全局变量g_c地址:%d\n", &g_c); printf("静态全局变量s_g_a地址:%d\n", &s_g_a); printf("静态全局变量s_g_b地址:%d\n", &s_g_b); printf("静态全局变量s_g_c地址:%d\n", &s_g_c); printf("全局常量c_g_a地址:%d\n", &c_g_a); printf("全局常量c_g_b地址:%d\n", &c_g_b); printf("全局常量c_g_c地址:%d\n", &c_g_c); // 静态局部变量 static int s_a = 111; static int s_b = 222; static int s_c = 333; // 局部变量 int a = 11; int b = 22; int c = 33; // 局部常量 const int c_a = 666; const int c_b = 777; const int c_c = 888; printf("静态局部变量s_a:%d\n", &s_a); printf("静态局部变量s_b:%d\n", &s_b); printf("静态局部变量s_c:%d\n", &s_c); printf("局部变量a:%d\n", &a); printf("局部变量b:%d\n", &b); printf("局部变量c:%d\n", &c); printf("局部常量c_a:%d\n", &c_a); printf("局部常量c_b:%d\n", &c_b); printf("局部常量c_c:%d\n", &c_c); // 堆区 int *p1 = malloc(101); int *p2 = calloc(1, 202); int *p3 = realloc(p1, 303); printf("malloc申请的空间起始地址:%d\n", p1); printf("calloc申请的空间起始地址:%d\n", p2); printf("realloc申请的空间起始地址:%d\n", p3); } int main(int argc, char const *argv[]) { test(); return 0; }

这里使用C语言编写的代码,使用gcc编译器编译,运行a.out的结果

我们知道在不管是32位还是64位,int整型类型大小为4Byte

从上面的代码运行之后的结果可以看出全局变量、静态全局变量、静态局部变量的地址是紧挨着的,三个全局常量放在一块,局部变量和局部常量则紧挨着的,且不断增大(负的),而堆区申请的三个空间也是紧挨着的,结合上图程序运行中的内存分区,全局变量、静态全局变量和静态局部变量其实是存放在全局区内,也就是存在一块儿,而局部变量和局部常量则存放在栈区,栈区是一种先进后出的数据结构,全局常量则是存放在常量区的,malloc、calloc和realloc申请的空间则是存放在堆区的,在这几个分区中,堆区的空间一般是最大的。

ps:这里为了方便,使用%d,显示数值便于观看,以人类的方式来理解,哈哈哈,因为习惯看十进制的我觉得16进制不太友好,不过我还是附上16进制的代码和结果,见下:

#include #include #include // 地址为八进制或者16进制 // c语言中用字母加下划线连接 // c++中用驼峰式命名法则 // 全局变量 int g_a = 1; int g_b = 2; int g_c = 3; // 静态全局变量 static int s_g_a = 100; static int s_g_b = 200; static int s_g_c = 300; // 全局常量 const int c_g_a = 10; const int c_g_b = 20; const int c_g_c = 30; void test() { printf("全局变量g_a地址:%p\n", &g_a); printf("全局变量g_b地址:%p\n", &g_b); printf("全局变量g_c地址:%p\n", &g_c); printf("静态全局变量s_g_a地址:%p\n", &s_g_a); printf("静态全局变量s_g_b地址:%p\n", &s_g_b); printf("静态全局变量s_g_c地址:%p\n", &s_g_c); printf("全局常量c_g_a地址:%p\n", &c_g_a); printf("全局常量c_g_b地址:%p\n", &c_g_b); printf("全局常量c_g_c地址:%p\n", &c_g_c); // 静态局部变量 static int s_a = 111; static int s_b = 222; static int s_c = 333; // 局部变量 int a = 11; int b = 22; int c = 33; // 局部常量 const int c_a = 666; const int c_b = 777; const int c_c = 888; printf("静态局部变量s_a:%p\n", &s_a); printf("静态局部变量s_b:%p\n", &s_b); printf("静态局部变量s_c:%p\n", &s_c); printf("局部变量a:%p\n", &a); printf("局部变量b:%p\n", &b); printf("局部变量c:%p\n", &c); printf("局部常量c_a:%p\n", &c_a); printf("局部常量c_b:%p\n", &c_b); printf("局部常量c_c:%p\n", &c_c); // 堆区 int *p1 = malloc(101); int *p2 = calloc(1, 202); int *p3 = realloc(p1, 303); printf("malloc申请的空间起始地址:%p\n", p1); printf("calloc申请的空间起始地址:%p\n", p2); printf("realloc申请的空间起始地址:%p\n", p3); } int main(int argc, char const *argv[]) { test(); return 0; }

运行结果:

 由此可见存放在内存中的数据可不是随便乱放的哟,正如世间万物似乎都按照某种规则存在着。

由此看来内存分区还真神奇嘞



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3