日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

《深度探索C++对象模型》--4 Function语意学

發(fā)布時(shí)間:2025/3/21 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深度探索C++对象模型》--4 Function语意学 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


1member的各種調(diào)用方式

1nonstaticmember functions

C++的設(shè)計(jì)準(zhǔn)則之一就是:非靜態(tài)成員函數(shù)至少必須和一般的非成員函數(shù)有相同的效率,編譯器內(nèi)部將成員函數(shù)轉(zhuǎn)換為對等的非成員函數(shù)實(shí)體。通過安插this指針和mangling等完成。

2namemangling(名字的特殊處理)

使名字獨(dú)一無二,函數(shù)的signature為函數(shù)名稱+參數(shù)個(gè)數(shù)+參數(shù)類型;

3virtualmember functions

通過vptr來調(diào)用。有時(shí)inline會極大地提高效率。

4staticmember function

注意一個(gè)問題:如果class設(shè)計(jì)staticdata member聲明為nonpublic,那么必須提供一個(gè)member function 來存取該member,雖然可以不依靠classobject來存取staticmember,但存取函數(shù)必須綁定于一個(gè)classobject上。此時(shí)引入了staticmember function

主要特性是沒有this指針。注意它不能直接存取nonstatic members;不能被聲明為const、volatilevirtual;不需要經(jīng)由classobject才被調(diào)用(但是可以)。

對其取地址,得到的是在內(nèi)存中的地址,是一個(gè)nonmember函數(shù)的指針。

2virtual function members

1)單一繼承時(shí)

當(dāng)一個(gè)類派生自另一個(gè)類,一共會有三種可能:

它可以繼承base class所聲明的virtualfunctions的函數(shù)體,正確的說是該函數(shù)體的地址被拷貝到derivedclassvirtualtable相對應(yīng)的slot之中;

它可以使用自己的函數(shù)體,這表示它自己的函數(shù)體地址必須放在對應(yīng)的slot之中;

它可以加入一個(gè)新的virtual function,此時(shí)virtualtable的尺寸會增大一個(gè)slot,新的函數(shù)體地址會被放進(jìn)該slot之中。

2)多重繼承時(shí)

一個(gè)derivedclass內(nèi)含n-1個(gè)額外的virtualtablen表示上一層baseclasses的個(gè)數(shù)),一個(gè)主要的與最左端的base class共享,其他的依次與其他base class的有關(guān)。

3)虛擬繼承時(shí)

建議不要在virtualbase class中聲明nonstaticdata members

3、指向member function的指針

1)復(fù)習(xí)成員函數(shù)指針:

指向類的非靜態(tài)成員指針在聲明時(shí)必須指明classobject

double(Point::*pmf)();//聲明,指出返回值類型,類名稱,參數(shù)列表

double(Point::*cord)() = &Point::x; //初始化,賦值通過&取地址

2)支持“指向virtualmember functions”的指針

虛擬機(jī)制仍然能夠在使用“指向memberfunction之指針”的情況下運(yùn)行;對一個(gè)virtualmember function取地址,所得到的是其在virtualtable的索引值。

對于如何區(qū)分內(nèi)存地址還是vtbl的索引?采用一種基于假設(shè)繼承體系中最多只有128個(gè)virtualfunctions的方法。(即首位是1還是0

3)多重繼承之下,指向member functions的指針

對于通過memberfunctions指針來調(diào)用的操作,需要導(dǎo)入一個(gè)vcall thunk。函數(shù)指針地址要么是真正的member function地址(nonvirtual時(shí)),要么是vcallthunk的地址。vcall thunk會選出并調(diào)用相關(guān)vtbl中適當(dāng)?shù)?/span>slot

4、Inline Functions

1)用inline來完成setget操作很高效。

2inline實(shí)現(xiàn)中,對于面對會帶來副作用的實(shí)際參數(shù),編譯器通常會引入臨時(shí)對象;如果實(shí)際參數(shù)是一個(gè)常量表達(dá)式,會在替換之前先進(jìn)行求值操作,后續(xù)的inline時(shí)直接將常量綁定;如果不是上述兩點(diǎn)就直接替換。

3)如果inline函數(shù)中有許多局部變量,則會產(chǎn)生巨多臨時(shí)對象,這影響效率,要注意。

總結(jié)

以上是生活随笔為你收集整理的《深度探索C++对象模型》--4 Function语意学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。