最近跟着达内的视频学习了一下Linux内核相关的一些东西,之后每有一些学习心得便如下总结成一篇博客。
Linux学习心得一:
理解malloc的工作原理:
使用一个数据结构(链表)维护分配空间
链表的构成:分配的空间/上一个空间数据/下一个空间数据/管理分配空间大小的数据
对malloc分配的空间不要越界访问,因为容易破坏后台链表的维护结构。会导致malloc/free/calloc/realloc不正常工作
内存空间与变量的关系:
1.内存分四个区
全局栈,局部栈,堆,代码区
2.各种变量对应存放区
3.堆栈是一种管理内存的数据结构
4.查看程序的内存地址:getpid(),/proc,cat maps…
C++与C中的堆分配与删除函数的联系跟区别:
new 与malloc的关系:
new的实现使用的是malloc。
区别:new使用malloc后,还会初始化空间。对于基本类型,直接初始化默认值,整数初始化为0。对于UDT类型,调用指定的构造器(或者默认构造器)。
delete和free区别:
delete也是使用free来完成删除的,但是delete会先调用析构器,再调用free。
delete p和delete[] p区别:
delete p和delete[] p都会正确的释放p,但是前者只会调用一次析构函数,而后者会对[]的每一个对象都调用一次析构函数。
定位分配 new(),对应realloc函数
calloc对应new[]
函数调用tips:
1.函数在执行的时候,拥有自己的栈空间(临时栈);
2.C++成员函数执行时,有自己和对象的两个栈空间。函数的参数就在临时栈,如果传递实参,则用来初始化临时参数变量。
3.对于函数指针,多传递实参是不会使用的,所以函数还是会正确工作。
4.指针传递和引用传递时,函数会创建一个临时栈,拷贝指针指向的地址,及变量地址,还是会产生指针地址的拷贝。两者区别是指针传递对值进行修改,需要对内存进行提取,即*操作,而引用传递自带提取操作。
不同函数调用方法(或者说函数导出方法)_stdcall, _cdecl, _fastcall(Linux中,用__attribute__((stdcall))表示)的区别:
1.决定函数参数的压栈顺序;
2.决定函数栈的清空方式;
3.决定函数的命名方式。