virtual function的一些心得
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
virtual function是design上一個(gè)非常好的東西,它可以在保持面向接口編程的前提下做到運(yùn)行時(shí)刻動(dòng)態(tài)決定使用某一種實(shí)現(xiàn)。
而且使得代碼的語(yǔ)義表達(dá),設(shè)計(jì)美感都好很多。
問(wèn)題就是virtual function太費(fèi)了。
對(duì)于pc平臺(tái)來(lái)說(shuō),它是亂序執(zhí)行的cpu,cache miss還可以忍受,對(duì)于console平臺(tái),這種順序執(zhí)行的處理器,cache miss會(huì)帶來(lái)非常大的性能損失。
virtual?function table與object在內(nèi)存上的分離,決定要在很大可能上付出一個(gè)額外的cache miss,這是很可惜的。
個(gè)人認(rèn)為,對(duì)于virtual的態(tài)度可以這樣:
變換方式包括:
?????
virtual ?function?version:class ?CmdBufInterface
... {
????virtual?void?flip()=;
} ;
class ?CmdBufDoubleBuffer
... {
????virtual?void?flip()...{....}
} ;
class ?CmdBufRingBuffer
... {
????virtual?void?flip()...{....}
} ;
class ?GcmManager
... {
????CmdBufInterface*?mCmdBuf;
????void?Init()
??...{
#if?DEBUG
????????mCmdBuf?=?new?CmdBufDoubleBuffer;
#else
????????mCmdBuf?=?new?CmdBufRingBuffer;
#endif
??}
} ;
e.g.?MY?favorate:?I?think? this ? is ?good? for ?a?replacement?of? virtual ?function,?and?no?disadvantage?of?design?side.
class ?CmdBufDoubleBuffer
... {
????void?flip()...{....}
} ;
class ?CmdBufRingBuffer
... {
????void?flip()...{....}
} ;
?
#if ?DEBUG
typedef??CmdBufDoubleBuffer?CmdBufInterface;
#else
typedef?CmdBufRingBuffer?CmdBufInterface;
#endif
class ?GcmManager
... {
????CmdBufInterface*?mCmdBuf;
????void?Init()
??...{
????????mCmdBuf?=?new?CmdBufInterface;
??}
} ;
?
2,? 運(yùn)行時(shí)刻的變換可以是callback函數(shù)。這里我原先有個(gè)誤解,以為callback函數(shù)指針地址也要有一個(gè)memory訪問(wèn),所以也會(huì)有cache miss,不會(huì)有優(yōu)勢(shì)。但是我錯(cuò)了,virtual function的訪問(wèn)也需要去訪問(wèn)object的內(nèi)存,然后跳到virtual table,然后是函數(shù)地址。call back只是訪問(wèn)object內(nèi)存就可以了。而且object內(nèi)存在load到cache里面之后,在函數(shù)中有很大幾率又會(huì)被訪問(wèn)到,所以這個(gè)cache miss很大幾率不是白費(fèi)的,可以得到和正常函數(shù)一樣的效率。
原文鏈接: http://blog.csdn.net/ccanan/article/details/2204345
轉(zhuǎn)載于:https://my.oschina.net/dtec/blog/44716
總結(jié)
以上是生活随笔為你收集整理的virtual function的一些心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mongodb数据迁移2种方式比较
- 下一篇: gdc2011一些“其他”