简单理解各知识点
1.函数的栈空间
要避免栈空间溢出。
当调用一个函数时,就会在栈空间,为这个函数,分配一块内存区域,
这块内存区域,专门给这个函数使用。
这块内存区域,就叫做“栈帧”。
当再次调用这个函数时就会再重新分配一块内存区域给这个函数
运行一段因为栈帧空间溢出,而崩溃代码示例
#include <iostream>
#include <Windows.h>
void test(void) {
//运行时将因为栈帧空间溢出,而崩溃
char buff[2000000];
std::cout << (int)buff[sizeof(buff) - 1] <<std::endl;
}
int main(void) {
test();
system("pause");
return 0;
}
2.内联函数
内联函数:
当编译器在编译时, 如果遇到内联函数,
就会直接将整个函数体的代码插入”调用处”,
就相当于内联函数的函数体, 在调用处被重写了一次。
以避免函数调用的开销, 获得更快的时间。
内联函数的缺点:
使调用内联函数的程序,变得“臃肿”,消耗调用函数的“栈”空间。
内联函数的用法:
inline int add(int a, int b) // inline关键字 可以把函数指定为内联函数
{
return a + b;
}
内联函数的使用场合:
1)内联函数中的代码应该只是很简单、执行很快的几条语句。
2)这个函数的使用频度非常高,比如在一个循环中被千万次地使用。
注: 数的定义(即整个数体),而不能只出现内联函数的声明。
3.递归函数
定义:在函数的内部,直接或者间接的调用自己。
要点:再定义递归函数时,一定要确定一个“结束条件”!!!
使用场合:
处理一些特别复杂的问题,难以直接解决。
但是,可以有办法把这个问题变得更简单(转换成一个更简单的问题)。
设计递归函数的要点:
把问题拆解成问题本身, 但是拆解后的问题的”规模”更小, 或者难度更低.
递归函数的缺点:
性能很低!!!
实际开发中, 极少使用!