【Boolan】第五周筆記

1.關于vptr和vtbl
之前的學習已經(jīng)了解到c++多態(tài)主要靠虛函數(shù)實現(xiàn)掷倔,如果說c++的class在實現(xiàn)上相比c的struct有什么開銷的話,那么虛函數(shù)表(vtbl)的維護和每個對象實例里虛表指針(vptr)將是比較明顯的開銷。
對于如下三個類

class A {  
public:  
    virtual void vfunc1() { cout << "A::vfunc1\n"; }  
    virtual void vfunc2() { cout << "A::vfunc2\n"; }  
    void func1() { cout << "A::func1\n"; }  
    void func2() { cout << "A::func2\n"; }  
};  
  
class B : public A {  
public:  
    virtual void vfunc1() { cout << "B::vfunc1\n"; }  
    void funcb() { cout << "B::funcb\n"; }  
};  
  
class C : public B {  
public:  
    virtual void vfunc1() { cout << "C::vfunc1\n"; }  
    void funcc() { cout << "C::funcc\n"; }  
};  

非虛成員函數(shù):A::func1(),A::func2(),B::funcb()冠句,C::funcc()會單獨在內(nèi)存里存一份
虛成員函數(shù):A::vfunc1(),A::vfunc2()幸乒,B::vfunc1()懦底,C::vfunc1()也會單獨存一份,但是這四個虛函數(shù)會由虛函數(shù)表來記錄逝变,由于這個例子里有三個類基茵,因此內(nèi)存里會有三份虛函數(shù)B::vfunc1(),A::vfunc2()壳影,表拱层,我們假設它們?yōu)锳,B宴咧,C表根灯。 A表里會有兩個指針,分別指向A::vfunc1()掺栅,A::vfunc2()的地址烙肺,B表里兩個指針,分別指向B::vfunc1()氧卧,A::vfunc2()桃笙,同理,C表里的指針指向C::vfunc1()沙绝,A::vfunc2()搏明。
對于用基類指針new子類的情況:A pa = new B; 這個實例對象里放的也是B類對應的虛函數(shù)表鼠锈,因為編譯器做了個向上轉(zhuǎn)型(upcasting)。
其實理解了虛函數(shù)表在內(nèi)存的形式后星著,調(diào)用虛函數(shù)的代碼可以這么表示: (
(pa->vptr)[n])(pa) 因為第一個參數(shù)肯定是*this购笆。

2.動態(tài)綁定
為了C++的多態(tài)性,是有動態(tài)綁定和靜態(tài)綁定這兩種說法的:
靜態(tài)綁定:綁定的對象是靜態(tài)類型虚循,也就是編譯期就能決定的同欠,是確定的,不會更改的横缔,比如 A a; a的內(nèi)容雖然會在運行期發(fā)生改變铺遂,但是a就是a,這點是不會變的茎刚。
動態(tài)綁定:綁定的對象是動態(tài)類型娃循,動態(tài)類型就是指在編譯期無法決定的,因為它可能在運行期發(fā)生改變斗蒋,比如指針:A* pa; pa可以在運行時重新指向其他對象笛质,或者轉(zhuǎn)型指向B類或者C類泉沾。

3.const
const對象不能調(diào)用non-const函數(shù),只能調(diào)用const函數(shù)妇押。

4.關于new,delete和重載
new和delete也是常用的跷究,新申明的數(shù)組需要使用內(nèi)存時,需要new一段size大小的空間敲霍,當使用結束時delete掉俊马,即釋放內(nèi)存,他倆是配合著使用的肩杈,不能忘寫其中一個柴我。

全局的new有六種重載形式:
void *operator new(std::size_t count)

throw(std::bad_alloc);             //一般的版本

void *operator new(std::size_t count,  //兼容早版本的new

const std::nothrow_t&) throw();    //內(nèi)存分配失敗不會拋出異常

void *operator new(std::size_t count, void *ptr) throw();

//placement版本

void *operator new[](std::size_t count)  //

throw(std::bad_alloc);

void *operator new[](std::size_t count,  //

const std::nothrow_t&) throw();

void *operator new[](std::size_t count, void *ptr) throw();

5.C++的各種new簡介

1.new T
第一種new最簡單,調(diào)用類的(如果重載了的話)或者全局的operator new分配空間,然后用類型后面列的參數(shù)來調(diào)用構造函數(shù)
2. new T[]
這種new用來創(chuàng)建一個動態(tài)的對象數(shù)組,他會調(diào)用對象的operator new[]來分配內(nèi)存(如果沒有則調(diào)用operator new,搜索順序同上),然后調(diào)用對象的默認構造函數(shù)初始化每個對象
3.new()T 和new() T[]
這是個帶參數(shù)的new,這種形式的new會調(diào)用operator new(size_t,OtherType)來分配內(nèi)存
這里的OtherType要和new括號里的參數(shù)的類型兼容,這種語法通常用來在某個特定的地址構件對象,稱為placement new,前提是operator new(size_t,void*)已經(jīng)定義,通常編譯器已經(jīng)提供了一個實現(xiàn),包含頭文件即可,這個實現(xiàn)只是簡單的把參數(shù)的指定的地址返回,因而new()運算符就會在括號里的地址上創(chuàng)建對象.需要說明的是,第二個參數(shù)不是一定要是void*,可以識別的合法類型,這時候由C++的重載機制來決定調(diào)用那個operator new.當然,我們可以提供自己的operator new(size_,Type),來決定new的行為
4. operator new(size_t)
這個的運算符分配參數(shù)指定大小的內(nèi)存并返回首地址,可以為自定義的類重載這個運算符,方法就是在類里面聲明加上void *operator new(size_t size)
5.operator new[](size_t)
這個也是分配內(nèi)存,,只不過是專門針對數(shù)組,也就是new T[]這種形式,當然,需要時可以顯式調(diào)用
6.operator new(size_t size, OtherType other_value)和operator new[](size_t size, OtherType other_value)
需要強調(diào)的是,new用來創(chuàng)建對象并分配內(nèi)存,它的行為是不可改變的,可以改變的是各種operator new,我們就可以通過重載operator new來實現(xiàn)我們的內(nèi)存分配方案.
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扩然,隨后出現(xiàn)的幾起案子艘儒,更是在濱河造成了極大的恐慌,老刑警劉巖夫偶,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界睁,死亡現(xiàn)場離奇詭異,居然都是意外死亡兵拢,警方通過查閱死者的電腦和手機翻斟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來说铃,“玉大人访惜,你說我怎么就攤上這事嘹履。” “怎么了疾牲?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵植捎,是天一觀的道長。 經(jīng)常有香客問我阳柔,道長焰枢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任舌剂,我火速辦了婚禮济锄,結果婚禮上,老公的妹妹穿的比我還像新娘霍转。我一直安慰自己荐绝,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布避消。 她就那樣靜靜地躺著低滩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岩喷。 梳的紋絲不亂的頭發(fā)上恕沫,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音纱意,去河邊找鬼婶溯。 笑死,一個胖子當著我的面吹牛偷霉,可吹牛的內(nèi)容都是我干的迄委。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼类少,長吁一口氣:“原來是場噩夢啊……” “哼叙身!你這毒婦竟也來了?” 一聲冷哼從身側響起硫狞,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤曲梗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妓忍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虏两,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年世剖,在試婚紗的時候發(fā)現(xiàn)自己被綠了定罢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡旁瘫,死狀恐怖祖凫,靈堂內(nèi)的尸體忽然破棺而出琼蚯,到底是詐尸還是另有隱情,我是刑警寧澤惠况,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布遭庶,位于F島的核電站,受9級特大地震影響稠屠,放射性物質(zhì)發(fā)生泄漏峦睡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一权埠、第九天 我趴在偏房一處隱蔽的房頂上張望榨了。 院中可真熱鬧,春花似錦攘蔽、人聲如沸龙屉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽转捕。三九已至,卻和暖如春唆垃,著一層夾襖步出監(jiān)牢的瞬間瓜富,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工降盹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谤辜。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓蓄坏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丑念。 傳聞我的和親對象是個殘疾皇子涡戳,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容