Linux学习心得一

来源:互联网 发布:苹果刷机助手for mac 编辑:程序博客网 时间:2024/05/21 17:28

最近跟着达内的视频学习了一下Linux内核相关的一些东西,之后每有一些学习心得便如下总结成一篇博客。


Linux学习心得一:

理解malloc的工作原理:

使用一个数据结构(链表)维护分配空间

链表的构成:分配的空间/上一个空间数据/下一个空间数据/管理分配空间大小的数据

malloc分配的空间不要越界访问,因为容易破坏后台链表的维护结构。会导致malloc/free/calloc/realloc不正常工作

 

内存空间与变量的关系:

1.内存分四个区

全局栈,局部栈,堆,代码区

2.各种变量对应存放区

3.堆栈是一种管理内存的数据结构

4.查看程序的内存地址:getpid()/proccat maps…

 

C++与C中的堆分配与删除函数的联系跟区别:

newmalloc的关系:

new的实现使用的是malloc

区别:new使用malloc后,还会初始化空间。对于基本类型,直接初始化默认值,整数初始化为0。对于UDT类型,调用指定的构造器(或者默认构造器)。


deletefree区别:

delete也是使用free来完成删除的,但是delete会先调用析构器,再调用free


delete pdelete[] p区别:

delete pdelete[] p都会正确的释放p,但是前者只会调用一次析构函数,而后者会对[]的每一个对象都调用一次析构函数。


定位分配 new(),对应realloc函数

calloc对应new[]


函数调用tips:

1.函数在执行的时候,拥有自己的栈空间(临时栈);

2.C++成员函数执行时,有自己和对象的两个栈空间。函数的参数就在临时栈,如果传递实参,则用来初始化临时参数变量。

3.对于函数指针,多传递实参是不会使用的,所以函数还是会正确工作

4.指针传递和引用传递时,函数会创建一个临时栈,拷贝指针指向的地址,及变量地址,还是会产生指针地址的拷贝。两者区别是指针传递对值进行修改,需要对内存进行提取,即*操作,而引用传递自带提取操作。


不同函数调用方法(或者说函数导出方法)_stdcall, _cdecl, _fastcall(Linux中,用__attribute__((stdcall))表示)的区别:

1.决定函数参数的压栈顺序;

2.决定函数栈的清空方式;

3.决定函数的命名方式。



原创粉丝点击