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.無連接:函數的局部變量或局部類。
C++/C函數