1.C语言内存总结

1.1内存
计算机程序由代码加数据组成,程序运行需要在内存中运行。而计算机程序运行的过程就是一个个函数执行的过程,通过加工数据得到一定的结果。
1.1.1静态内存
静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。
程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会
自动释放所占用的内存空间。
变量的分配与释放,都无须程序员自行考虑。
基本类型,数组
1.1.2动态内存
用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。
1.1.3区别
a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。
b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。
c) 动态内存分配需要指针和引用类型支持,静态不需要。
d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。

1.2冯诺依曼结构和哈佛结构
冯诺依曼结构:数据和代码放在一起;哈佛结构:数据和代码分开放置。

1.3内存管理
操作系统:以页的形式(其实就是块)来管理的,一般大小是4KB的大小。一般调用API函数接口进行管理:
(1)汇编中直接操作内存地址。
(2)在C语言中,使用malloc和free来申请和释放内存。
(3)在C++中,可以使用new delete函数组合来管理内存。
(4)Java和c#不直接操作内存,而是通过操作虚拟机来实现内存的操作。假如程序员忘记了将申请的内存释放,那么虚拟机会帮你释放内存。
非操作系统:程序员自己来管理,即编程的人需要自己来计算内存的使用和安排。

1.4内存编址
内存的编址单位是字节。

1.5位、字节、半字、字
位就是一个bit位
字节就是8bit
字与硬件平台相关,如果是32位,一个字就是4字节,半字就是2字节。
扩展:
总线一般被设计来传输固定大小的的一块数据,这个快数据就被称为字,一个字所包含的字节数大小就是字的大小。
32位系统指的是有32位数据线,但是一般地址线也就是32位,这个地址线32决定了最大地址只能到32位。逻辑上大小就为2的32次方。

1.6数据类型
数据类型与硬件平台有关,以32位硬件平台为例:
数据类型  char   short   int   long  float  double
占用空间    1          2       4      4        4        8   
注意:
a.在32平台中,int类型访问效率最高。
b.定义一个bool,但实际上编译器分配了一个int的空间。

1.7内存对齐
内存对齐,也称字节对齐,它主要是指数据存储在内存中时,应该放置在地址是数据项大小的整数倍的内存位置上。关于内存对齐可参考以下博客文章:
https://www.cnblogs.com/scut-linmaojiang/p/5281369.html
https://blog.csdn.net/dai_wen/article/details/78304568
https://blog.csdn.net/hbuxiaofei/article/details/9491953


1.8 C语言如何操作内存
a.C语言对内存地址的封装,用变量名来访问内存。
b.C语言中的数据类型的本质含义:表示一个内存空间的长度和解析方法。
c.C语言通过指针来间接访问内存。

1.8内存管理之结构体
数据结构就是研究数据如何组织,即在内存中如何排布和加工计算的学科。
数据和结构体都是数据结构的一种,数组的优点是简单,可通过下标访问内存。缺点是在定义的时候必须给定大小,且所有元素必须是同一个数据类型。
因此引入结构体数据类型,其可以包含多挣数据类型,且可以通过内嵌指针实现面向对象的功能设计。

1.9 栈内存
栈是一种数据结构,C语言使用栈保存局部变量。
先进后出 FILO    first in last out        栈
先进先出 FIFO   first in first out      队列
a.栈自动管理,不需要程序员干预。
b.反复使用,脏内存。
c.栈会溢出。
f.临时性,不可返回变量地址。
g.栈的四种情况,满增栈,满减栈,空增栈,空减栈,至于是那种要根据编译器决定。

1.10 堆内存
堆也是一种内存管理方式。
a.操作系统堆管理器管理:堆管理器是操作系统的一个管理模块,堆管理内存分配灵活,按需分配。
b.大块内存:堆内存管理者总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。
c.脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的。
d.临时性:堆内存只在malloc和free之间属于我这个进程,而可以访问。在malloc之前和free之后都不能再访问,否则会有不可预料的后果。
e.程序手动申请&释放。

1.11复杂数据结构
链表、哈希表、二叉树、图。
 

你可能感兴趣的:(C语言)