cs保研经验贴|计算机基础知识
malloc 和 new
new从堆区和自由存储区上分配内存,malloc从堆上分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。
malloc只负责分配一块指定大小的内存空间,返回一个指向该空间的void*类型指针。new无须指定内存块的大小,它会在分配内存的同时调用构造函数初始化对象,并返回一个指向该对象的指针。
new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数;malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数。
new在遇到内存分配失败时会抛出std::bad_alloc异常,而malloc则返回NULL指针表示分配失败。
函数名,函数指针,函数的入口地址:
函数名:c语言中,函数名就是一个函数指针。
入口地址:函数时执行的第一条指令的地址,通过这个地址可以找到该函数。
函数指针:指向入口地址,就可以通过该指针调用函数了。
数组名,数组首地址,数组指针:
数组名不是指针,是数组首地址。但 sizeof 时返回整个数组地址大小。
编译器会自动将 数组名 a 替换为 指向该数组首元素的指针 &a[0]。
递归和循环
相同点:
递归和循环的本质都是代码复用。
递归和循环在理论上具有相同的计算能力。
不同点:
递归需要系统维护一个系统工作栈,规模小,受到系统工作栈大小的限制。
指针和引用
指针和引用都是用于处理变量的间接访问。
指针是一个变量,存储了另一个变量的内存地址,可以被重新分配给其他变量,也可以指向空地址(NULL)。引用是目标变量的别名,它是对目标变量进行直接访问,一旦被初始化,就不能再改变它所引用的变量。
栈区和堆区
内核空间:应用程序不允许访问的部分,只能由内核进行操作,操作系统的内核程序映射到这个区域。
栈区:编译器自动分配释放、内存分配连续、生长方向向下、存放函数参数和局部变量、返回地址等。效率高,硬件提供支持,压栈和出栈都有专门的指令。
堆区:堆的内存分配和释放需要显式地进行管理、内存分配不连续、它们是不同区域的内存块通过指针链接起来的。由库函数或运算符来完成申请与管理,效率较低,而且容易产生内存碎片。
静态存储区(全局内存区):全局内存区是用于存储全局变量、静态变量和静态常量的一块内存区域。这块内存在程序启动时被分配,并在整个程序的生命周期中一直存在,直到程序结束才被释放。
常量区:常量区用于存储常量字符串和其他常量数据。这些数据在程序运行期间是只读的。
程序代码区:代码区存储程序的指令,也就是可执行代码(编译后的机器代码)。
底层容器
vector 是连续的,deque 则是分段连续。deque 会维护不同 array 之间的关联信息,使用户无需关心分段这个事实。
stack、queue使用deque作为底层容器。
priority_queue 使用 vector 作为底层容器。