函数堆栈的三个用途:
1.进入函数前保存环境变量和返回地址;
2.进入函数时保存实参的拷贝;
3.保存函数体内的局部变量。
函数调用规范:定义函数实参压栈,退栈以及堆栈释放方式。
1._cdecl:函数默认规范,参数从右到左依次压栈,便于可变参数函数,C++静态成员函数和友元函数使用此规范。
2._thiscall:C++非静态成员函数的默认规范,不能使用可变参数。当非静态成员函数调用时,this指针直接保存在ECX寄存器中,而不是函数堆栈。
函数连接规范:
1.通用的C连接规范:
#ifndef _cplusplus
extern "C" {
#endif
#ifndef _cplusplus
}
#endif
函数参数:
1. C包括值传递和地址传递,C++增加了引用传递(引用的创建和销毁不会调用对象的构造函数和析构函数)。
2. C无参函数需要使用void,否则认为接受任何类型和个数的参数。而C++无参数函数则表示不接受任何参数。
函数返回值:
1. C不加函数返回值类型的函数,统一当成int处理,而C++不允许没有返回值类型。
2. C++返回值为引用,如果返回值为内部局部变量,则会导致引用无效内存。
3.返回值效率,如:
1). return String(a);
临时变量创建并初始化在外部存储区,省去了拷贝和析构开销。
2). String result(a);
return result;
result对象被创建,调用构造函数初始化。接着调用拷贝构造函数,把result对象复制到保存返回值的外部存储区,最后在函数结束时调用析构函数销毁result对象。
存储类型:
全局变量和全局函数:extern
全局常量:static
局部变量: auto
register类型则加载到CPU寄存器中,减少和内存的交互开销,一般为循环计数器。
连接类型:
1.外连接:在别的编译单元中被调用,如全局变量和全局函数或者被extern修饰的全局常量。
2.内连接:仅在一个编译单元被调用,如全局常量,static修饰的变量,类,匿名联合体,typedef定义。
3.无连接:函数的局部变量或局部类。