1. 程式人生 > >static成員函數不能調用non-static成員函數

static成員函數不能調用non-static成員函數

itl 長度 修飾 使用 轉換 需要 edi ast 內容

1 一般類靜態成員函數不能調用非靜態成員函數

2 static成員函數可以調用構造函數嗎?

答案是肯定的,由於static成員函數沒有this指針,所以一般static成員函數是不能訪問non-static成員的,包括成員函數和成員變量。

由於構造函數特殊性,它從無到有構造一個對象,因此調用它不需要一個instance,也就是不需要this指針來調用,所以在static 函數中能調用構造函數。
o 構造函數分成兩個階段:
1. 分配內存:這是從無到有階段,該階段結束,產生一個instance,也即this。
2. 初始化內存:真正調用構造函數的部分。此時已經是對該instance調用構造函數,因此,可以調用任何非靜態函數。
o 在靜態函數中,只要是通過instance.Func()或者pointer->Func()的方式就可以調用非靜態函數,因為顯式指定了this。
因此提倡在所有非靜態成員函數中顯示使用this來使用成員。

首先一個IO操作其實分成了兩個步驟:發起IO請求和實際的IO操作,同步IO和異步IO的區別就在於第二個步驟是否阻塞,如果實際的IO讀寫阻塞請求進程,那麽就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信號驅動IO都是同步IO,如果不阻塞,而是操作系統幫你做完IO操作再將結果返回給你,那麽就是異步IO。阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果阻塞直到完成那麽就是傳統的阻塞IO,如果不阻塞,那麽就是非阻塞IO。

調度算法:

NOOP

CFQ

deadline

C/C++函數調用方式

__cdecl __fastcall與__stdcall,三者都是調用約定(Calling convention),它決定以下內容:1)函數參數的壓棧順序,2)由調用者還是被調用者把參數彈出棧,3)以及產生函數修飾名的方法。
1、__stdcall調用約定:函數的參數自右向左通過棧傳遞,被調用的函數在返回前清理傳送參數的內存棧。 2、_cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數采用從右到左的壓棧方式。註意:對於可變參數的成員函數,始終使用__cdecl的轉換方式。 3、__fastcall調用約定:它是通過寄存器來傳送參數的(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧)。 4、thiscall僅僅應用於"C++"成員函數。this指針存放於CX寄存器,參數從右到左壓。thiscall不是關鍵詞,因此不能被程序員指定。
5、nakedcall采用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked call不產生這樣的代碼。naked call不是類型修飾符,故必須和_declspec共同使用。 cdecl 是 C 語言的調用方式,函數參數從右到左求值,然後入棧,參數由調用方負責清理,傳多少參數其實都無所謂的,於是就支持所謂的可變長度的參數; stdcall 是 C++ 的調用方式,參數從右到左求值,入棧,由被調用方處理參數,所以參數個數類型都必須匹配; pascal 是對 PASCAL 函數的調用方式,參數自左向右求值,其他類似於 stdcall; 而 fastcall 的情況忽略。

static成員函數不能調用non-static成員函數