浅谈内存分类等等

在进行C/C++以及嵌入式开发的时候要对内存的了解比较精确,经常要操作的内存分类可以如下:栈区(stack)、堆区(heap)、常量区、静态区(全局区)(static)、代码区。

栈区由编译器自动分配和释放,一般存放函数的参数、局部变量的值等,操作和数据结构中的栈的操作类似。

堆区由程序员自己分配与释放,如果程序员不释放,则在程序运行完后,可能由系统收回,它与数据结构中的堆是不同的概念,分配方式与链表类似,可以用malloc、new来申请,

全局区(静态区)存放全局变量、全局静态变量、局部静态变量,全局变量与静态变量存放是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。程序结束后由系统释放。

常量区存放字符串等,在程序结束后由系统释放。

代码区存放函数体的二进制代码。

int qa = 10;//全局初始化区,存放在全局区(静态区)

char *pv;//全局未初始化区,存放在全局区(静态区)

main()

{

int a;//局部变量,存放在栈

char *pa;//栈

char *p = "asdasdasd";//p存放在栈区,字符串存放在常量区

static int b=1;//全局(静态)初始化区

pa = (char *)malloc(10);//分配得来的10字节就存在堆区,

strcpy(pa,"3156564654");//后面的字符串数字存放在常量区,

}

对于一个进程的内存空间而言,可以在逻辑上分为三个区:代码区、动态数据区、静态数据区。

动态数据区就是“堆栈”,栈是线性结构,堆是链式结构。进程的每个线程都独自的私有“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰的。

/***********************************************************************************************************/

可执行程序包括BSS段、数据段代码段(也称文本段)。

BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。BSS段属于静态内存分配。

注意和数据段的区别,BSS存放的是未初始化的全局变量静态变量数据段存放的是初始化后的全局变量和静态变量。数据段属于静态内存分配。

时间: 2024-10-14 01:48:26

浅谈内存分类等等的相关文章

【内存类操作】浅谈内存拷贝异常

结合本人在实际项目中所积累的经验,以及曾经犯过的错误,堆内存操作类函数做一个简单的剖析,抛砖引玉,欢迎大家吐槽. 首先,讲一下内存使用异常发生的几种场景. 1.野指针的使用,使用已经释放的指针,如果向野指针中写内容,就极有可能导致设备重启或任务挂死.因为,正在运行的任务的地址被意外的改写. [避免策略]函数入参要判空,指针使用(包括释放)之前一定要释放. 2.内存函数的错误使用: void *memset(void *s, int ch, size_t n); c语言中在<memory.h>或

Qt浅谈内存泄露(总结)

Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除父对象会将其子对象一起删除. C++中delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大.Qt中使用

OC - 浅谈内存管理

今天看到一篇不错的文章关于OC内存管理的,转载一下与你共享 概述我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 1 引用计数器 2

浅谈内存开辟问题和Block内存问题

我们知道,内存分为栈,堆,块. 栈中的内存由系统自己释放,堆是存对象初始化的地方,块是CPU与内存连接的缓冲器,运行速度比内存快,比CPU慢. 例如,我们NSMutableArray *array = [NSMutableArrar new]; NSMutableArray *array就在栈中,NSMutableArray类型的指针.[NSMutableArray new]开辟的内存在堆中,我们可以理解为 NSMutableArray *array --->[NSMutableArrar ne

JAVA NIO之浅谈内存映射文件原理与DirectMemory

Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数  read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有

浅谈SQL Server 对于内存的管理

简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) 对于计算机来说,存储体系是分层级的.离CPU越近的地方速度愉快,但容量越小(如图1所示).比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘.但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级.比如硬盘通常要比同时代的内存大一个数量级.

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato

关于分布式程序 java的内存管理浅谈

关于分布式程序 java的内存管理浅谈 标签(空格分隔): 分布式 内存管理 java Preface 当前全球正处于互联网时代,是个信息大爆炸时代.对于商家来说,每一天信息都是宝贵的,都可以转换成money的.所以对数据的处理要求也变的越来越严格,从以前的hadoop/MapReduce 的离线处理,到现在的准实时和实时处理,都是由数据需求而引起的技术革命.数据的处理快慢取决于很多因素.现在主流的解决方法,像Spark,Flink,Pular,包括腾讯,阿里,百度的诸多为开源的框架都是基于分布

浅谈操作系统与内存

浅谈操作系统与内存 对于计算机的发明,相信大家都有耳闻那个占地面积按平米算的第一台计算机.在那个时候,CPU的资源是极其珍贵的,随着这些年突飞猛进的发展,一片指甲盖大小的民用级CPU一秒钟能执行的指令数可以达到上亿级别. 随着计算能力的增长,芯片外围的硬件和配套的软件也是一路高歌,发生了天翻地覆的变化,今天我们简单回顾历史,来看一看操作系统和内存机制的演变,不仅要了解它们是怎样,同时也看看它们为什么会是这样. CPU的运行 一说到CPU(Center processing unit),大家都觉得