内存与编程小记

来源:互联网 发布:全国安全知识网络竞赛 编辑:程序博客网 时间:2024/05/21 19:32

内存概述:

一个内存单元是和一个编号绑定的,而这个单元就是字节。根据CPU位数(假设32位),其一次能处理32位数据,这显然是最快的,因此把4字节称为一个整形(int),所以常常处理一个int类型变量是快于处理char / bool类型变量,这就涉及到一个问题,定义变量是追求效率还是追求空间的节省?

内存对齐,这实际上就有硬件决定的,由在做内存芯片是多少字节是挨在一起影响的。例如字节数宽为4的bank,0 1 2 3这四个地址就是对齐的,因为他们都挨在一起;而1 2 3 4就不是对齐的。对齐访问速度大于非对齐访问。



程序在内存中的存储的两种方法:

一种是冯诺依曼结构,它将数据和代码放在一起存储;

另一种是哈佛结构,他将数据和代码分开存储。

因为后者的代码段只读无法更改,所以更加安全高效,但编程更加复杂。现在PC机中普编采用冯诺依曼结构,但实际上在CPU内部存在缓存区,用的还是哈佛结构,所以可以总结在CPU外部采用冯诺依曼结构,在CPU内部采用哈佛结构。


编程语言在操作内存时的方法:

(1)汇编直接用内存地址操作,无人管理。


(2)C语言在操作内存时:

栈:定义一般局部变量时,在栈中开辟一块单元,与该变量联系起来。例如int  a=5;先在栈中开辟4字节内存,并把首地址与a联系起来,再将5放入该区域(对数组是首元素的首地址)。在这里的变量随着函数的结束而消亡,不需要手动释放,但栈的大小固定,不应定义较大变量。

堆:一般操作较大的,或是常用的变量时,利用malloc(),calloc(),realloc()申请一块内存区域,但一定要记得用free()函数释放掉。一般我们用较大的数组,结构体,链表,哈希表是用。


(3)C++在操作内存时用new(),同样要记得用delete()。


(4)c# / java用虚拟机管理内存,直接new()就行了,你压根不用管。真羡慕你们有自行车的人。。。。。。。


0 0