C语言专题笔记——内存话题

          • 冯诺依曼结构和哈佛结构
          • 什么是内存
          • 结构体内嵌指针实现面向对象
          • 内存管理之栈
          • 内存管理之堆

冯诺依曼结构和哈佛结构
  • 冯诺依曼结构是:数据和代码放在一起。
  • 哈佛结构是:数据和代码分开存在。
  • 在S5PV210中运行的linux系统上,运行应用程序时:这是时候所有的应用程序的代码和数据都在DRAM,所以这种结构就是冯诺依曼结构;
  • 在单片机中,我们把程序代码烧写到Flash(NorFlash)中,然后程序在Flash中原地运行,程序中所涉及到的数据(全局变量、局部变量)不能放在Flash中,必须放在RAM(SRAM)中。这种就叫哈佛结构。
什么是内存?
  • 从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据 不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2…、LPDDR)。
  • 从逻辑角度:内存可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址的内容)、并且可以读写。内存在编程中天然用来存放变量的。
结构体内嵌指针实现面向对象
struct s
{
    int age;
    void (*pFunc)(void);
}

使用这样的结构就可以实现面向对象。
这样包含了函数指针的结构体就类似于面向对象中的class,结构体中的变量类似于class中的成员变量,结构体中的函数指针类似于class中的成员方法。

内存管理之栈
  • c语言中使用栈来保存局部变量。栈是被发明出来管理内存的。
  • 优点:栈管理内存,好处是方便,分配和最后回收斗不用程序员操心,c语言自动完成。
  • 约束:首先,栈是有大小的,所以栈内存大小不好设置。如果太小怕溢出,太大又浪费内存。(这个缺点有点像数组);其次,栈的溢出危害很大,一定要避免。
内存管理之堆

堆内存释放时最简单,直接调用free释放即可。 void free(void *ptr);
堆内存申请时,有3个可选择的类似功能函数:malloc、calloc、realloc。

void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);   
void *realloc(void *ptr, size_t size);    // 改变原来申请空间的大小

譬如要申请10个int元素的内存:
malloc(40);<——>malloc(10*sizeof(int));
calloc(10, 4);<—–>calloc(10, sizeof(int));

  • 优势:灵活。
  • 劣势:需要程序员去处理各种细节,所以容易出错,严重依赖程序员的水平。

你可能感兴趣的:(C语言专题,c语言,内存,冯诺依曼,应用)