virtual function的一些心得
為什么80%的碼農都做不了架構師?>>> ??
virtual function是design上一個非常好的東西,它可以在保持面向接口編程的前提下做到運行時刻動態決定使用某一種實現。
而且使得代碼的語義表達,設計美感都好很多。
問題就是virtual function太費了。
對于pc平臺來說,它是亂序執行的cpu,cache miss還可以忍受,對于console平臺,這種順序執行的處理器,cache miss會帶來非常大的性能損失。
virtual?function table與object在內存上的分離,決定要在很大可能上付出一個額外的cache miss,這是很可惜的。
個人認為,對于virtual的態度可以這樣:
變換方式包括:
?????
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,? 運行時刻的變換可以是callback函數。這里我原先有個誤解,以為callback函數指針地址也要有一個memory訪問,所以也會有cache miss,不會有優勢。但是我錯了,virtual function的訪問也需要去訪問object的內存,然后跳到virtual table,然后是函數地址。call back只是訪問object內存就可以了。而且object內存在load到cache里面之后,在函數中有很大幾率又會被訪問到,所以這個cache miss很大幾率不是白費的,可以得到和正常函數一樣的效率。
原文鏈接: http://blog.csdn.net/ccanan/article/details/2204345
轉載于:https://my.oschina.net/dtec/blog/44716
總結
以上是生活随笔為你收集整理的virtual function的一些心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb数据迁移2种方式比较
- 下一篇: gdc2011一些“其他”