對於虛函式,雖然一直知道怎麼用,但是對其內部機制卻不清楚。今天寫了小段程式然後反彙編:
class cbase
;void fun(){};
};class ctest:public cbase
;void fun(){};
};void main()
對以上反彙編後的關鍵**是:
void main()
結論:
類的成員函式是所有類共享的,是存放於**段,而每個類的成員函式都有他特定的記憶體空間。當乙個類例項化時,會分配一段記憶體空間存放成員變數,有意思的是當這個類有虛函式時,會預設的分配乙個指標空間,該指標指向乙個虛函式表。 當該例項進行函式呼叫時,如果是普通函式會直接呼叫該類的函式,如果是虛函式會通過該例項的指向虛函式表的指標進行對應的函式呼叫。
補充:class
cbase
;class
cderived :
public
cbase;};
void
test()
除錯發現p->test()雖然是呼叫的cderived的,但是使用的預設值卻是cbase的。
所以預設函式是屬於靜態繫結的。
基類虛析構函式分析
多型是由虛函式表來實現,通過父類指標來實現動態繫結。子類重寫父類的虛函式後,覆蓋虛函式表中父類該虛函式在表中原來的位置,也許 覆蓋 也就是由此得稱。那析構函式是否也如此呢?程式 中經常可以見到將基類的析構函式寫成虛函式,目的就是為了防止由以下這種情況造成的記憶體洩漏 class a class b ...
OSTaskCreate()函式分析
int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...
getopt函式分析
函式getopt主要用於拆分命令列引數,用這個函式就不自己寫命令列引數解析程式了,以下 摘自tcpdump原始碼,對這個函式比較感興趣,故對此進行分析注釋,因水平實在不敢恭維,不足之處希望能一起 函式getopt 有三個引數,nargc,nargv就是命令列傳過來的argc和argv字串ostr,它...