- 内存编址、寻址和内存对齐
内存编址是以字节为单位的,其中int整形和CPU本身的数据位宽是一样的,如32位CPU int是32位,整数类型当数据类型和内存相匹配时才能获得最好的性能。内存的对齐访问不是逻辑问题而是硬件问题,对齐访问很配合硬件所以效率会很高,因为非对齐访问和硬件本身不搭配,所以效率不高,由于兼容性问题,一般硬件提供非对齐访问,但是效率要低很多。 - 数据类型的本质含义
数据类型的本质含义表示所占内存格子的长度和解析方法的不同。
3.内存管理之栈 stack
栈的特点:1 栈是自动管理的,自动分配、自动回收
2 反复使用
3 脏内存
4 临时性
5 栈会溢出
栈是有大小的,栈内存太小怕溢出太大怕浪费内存,一定要避免栈的溢出。
局部变量都是存储在栈上的。静态局部变量在存储类方面和全局变量一样,只是改变了链接属性。 内存管理之堆 heap
由操作系统堆管理器管理,堆管理器是操作系统的一个模块,分配灵活按需分配。
堆的特点:1 大块内存
2 需要程序手动申请和释放
3 脏内存 堆内存也是反复使用的,而且在释放之前不会清楚,所以堆也是脏的
4 临时性 堆内存只有在malloc和free之间可以访问,在malloc之前和free之后都不能在访问。
举例说明:需要1000个int类型元素的数组 第一步:申请和绑定 int *P = (int *)malloc(1000 * sizeof(int)); 第二步:检验 if(NULL == P) { printf("malloc error.\n"); return -1; } 第三步:使用申请到的内存 第四步:释放 free(P); P = NULL;
谨记:在这个P释放之前一定不要另外赋值,否则这块内存就丢掉了,这就是所谓的程序吃内存也就是内存泄漏。
malloc的返回值是void * 类型的,malloc帮我们分配时只分配的内存空间,至于这个空间我们用来存储什么类型的元素malloc是不关心的,由我们自己来定。
void free(void *ptr) ;
void *malloc(size_t size) ;
void *calloc(size_t nmemb , size_t size) ;//需要nmemb个单元,size个字节
void *realloc(void *ptr ,size_t size);//改变原来申请的空间的大小。
//申请10个int类型元素的内存
(int *) malloc(10 *sizeof(int));
(int *)calloc(10 , sizeof(int));
malloc 返回的是一个void * 类型的指针,实质上malloc的返回值是堆管理器分配给我们本次申请的那段内存空间的首地址。
本博文只是作为自己的一个笔记,如果能帮助其他人更好,若有疑问欢迎指出,欢迎加QQ 1922546282,共同讨论与学习。