C++/C函数

函数堆栈的三个用途:

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.无连接:函数的局部变量或局部类。

 

posted @ 2017-09-02 16:17  一种微笑  Views(174)  Comments(0)    收藏  举报