C语言专题——内存

1

  1. 冯诺依曼结构:数据和代码在一起
  2. 哈佛结构:数据和代码分开
  3. 如何管理内存?
    ①从操作系统角度:操作系统掌握所有的硬件内存,因为内存很大,所以操作系统把内存分成页面,以页面为单位来管理。页面内用更细小的方式以字节为单位来管理。操作系统给我们提供了内存管理的接口,我们只需用API即可管理内存。
    没有操作系统(裸机)时:程序需要直接操作内存。
    ②从语言角度说:不同语言提供了不同的操作内存的接口。
    汇编:没有内存管理,汇编中操作内存时直接使用内存地址。
    C语言:C语言中编译器帮我们管理直接内存地址,我们都是通过编译器提供的变量名来访问内存的,操作系统下如果需要大块内存,可以通过API(malloc,free)来访问内存。
    C++:C++对内存的使用进一步封装。我们可以new创建对象(为对象分配内存),然后用delete来删除对象(释放内存)。
    java/c#:它们不直接操作内存,通过虚拟机来操作内存。

2

①:1字节(byte) = 8位(bit)

②:在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)

   在32位的系统中(比如win32) 1字(word)= 4字节(byte)=32(bit)

   在64位的系统中(比如win64)1字(word)= 8字节(byte)=64(bit)

1字等于操作系统的位数

3

  1. 内存编址是以字节为单位的

4

内存对齐:

  1. 我们在c中int a;定义一个int变量,在内存中分配4个字节的空间来存储a。有两种不同的存储方式:
  2. 对齐方式:0 1 2 3
  3. 非对齐方式:1 2 3 4 或者 2 3 4 5这样
  4. 内存的对齐访问不是逻辑的问题,而是硬件的问题。从硬件角度,0 1 2 3四个单元本身逻辑上有相关性,这4个字节组合起来存储int变量,在硬件上就是合适的,效率就高。

5.栈(stack)

  1. 栈(一个口入口即出口)是一种数据结构,用来管理内存,
    队列先进先出(有两个口)。
  2. 栈管理内存的特点:小内存,自动化,先进后出。
  3. C语言中的局部变量是用栈来实现的。
    我们在C语言中定义一个局部变量(int a;),编译器会在栈中分配一段空间(4字节)给这个局部变量用。栈顶指针的移动和内存分配是自动的。函数调用完成后,局部变量的生命周期结束,对应栈的操作是出栈。
  4. 栈管理内存好处是方便,分配和最后回收都不用程序员担心,C语言自动完成
  5. 分析一个细节:C语言中,定义局部变量时如果未初始化,则值是随机的。定义局部变量,局部变量的内存空间在栈上,而栈内存是反复使用的(是脏的),所以说定义局部变量未初始化时,值是随机的
  6. 栈是有大小的。所以栈内存大小不好设置,太小怕溢出,太大浪费内存。(有点像数组)。其次,栈的溢出有很大危害。

6.堆(heap)

  1. 堆是一种内存管理方式。堆的特点是:自由。堆内存是操作系统划归给堆管理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,然后向使用者提供API(malloc和free)来使用堆内存。
  2. 我们需要内存容量比较大时,需要反复使用及释放时,很多数据结构的实现都要使用堆内存。
  3. 特点:1.常规使用的需求容量都能满足。2.申请及释放都需要手动进行。
  4. 堆内存申请时,有3个可选择的类似功能的函数:malloc,calloc,realloc。
    例如要申请10个int元素的内存:malloc(10*sizeof(int))
  5. 堆内存释放时很简单,直接调用free释放即可。
  6. 优势:灵活;
    劣势:需要程序员去处理各种细节,容易出错。

7.复杂数据结构

数据结构

  1. 链表:链表在linux内核,驱动,应用中使用非常多。
  2. 哈希表:一般不需要自己去实现。哈希表和数组很像,根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
  3. 二叉树,图

数据结构和算法的关系

数据结构的发明都是为了配合一定的算法;算法是为了处理具体问题,算法的实现依赖于相应的数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值