• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Zero Lee的專欄

            Template and Inheritance

            As Meyers noted in Item 24 of Effective C++,the inability to inline a virtual function is its biggest performace penalty.
            Virtual functions seems to inflict a performace cost in several ways:
            [1] The vptr must be initialized in the constructor.
            [2] A virtual function is invoked via pointer indirection. We must fetch the pointer to the function table and then access the correct function offset.
            [3] Inlining is a compile-time decision. The compiler cannot inline virtual functions whose resolution takes place at run-time.
            The true cost of virtual functions then boils down to the third item only.

            -------------------------------------------------------------------------------------------
            Virtual function calls that can be resolved only at rum-time will inhibit inling. At times, that may pose a performace problem that we must solve. Dynamic binding of?a function call is a consequence of inheritance. One way to eliminate dyanamic binding is to replace inheritance with a template-based design. Templates are more performance-friendly in the sense that they push the resolution step from run-time to compile-time. Compile-time, as far as we are concerned, is free.

            The desing space for inheritance and templates has some overlap. We will discuss one such example.

            Suppose you wanted to develop a thread-safe string class that may be manipulated safely by concurrent threads in a Win32 environment. In that environment you have a choice of multiple synchronization schemes such ascriticalsection, mutex, and semanphores, just to name a few. You would like your thread-safe string to offer the flexibility to use any of those schemes, and at different times you may have a reason to prefer one scheme over another. Inheritance would be a reasonable choice to capture the commonality among synchronization mechanisms.

            The Locker abstract base class will declare the common interface:

            ?1 class ?Locker
            ?2 {
            ?3 public :
            ?4 ????Locker()? {?}
            ?5 ???? virtual ? ~ Locker()? {?}
            ?6 ???? virtual ? void ? lock ()? = ? 0 ;
            ?7 ???? virtual ? void ?unlock()? = ? 0 ;
            ?8 }
            ;
            ?9
            10 class ?CriticalSectionLock?:? public ?Locker
            11 {?
            12
            13 }
            ;
            14 class ?MutexLock?:? public ?Locker
            15 {
            16 ?
            17 }
            ;
            Because you prefer not to re-invent the wheel, you made the choice to derive the thread-safe string from the existing standard string. The remaining design choices are:

            [1] Hard coding. You could derive three distinct classes from string::CriticalSectionString, MutexString, and SemaphoreString, each class implementing its implied synchronization mechanism.
            [2] Inheritance. You could derive a single ThreadSafeString class that contains a pointer to a Locker object. Use polynorphism to select the particular synchronization mechanism at run-time.
            [3] Templates. Create a template-based string class parameterized by the Locker type.
            ////////////////////////////////////////////////////////////////////////////////////////////
            Here we only talk about the Template implementation.

            The templates-based design combines the best of both worlds-reuse and efficiency. The ThreadSafeString is implemented as a?template parameterized by the Locker template argument:
            ?1template?<class?LOCKER>
            ?2class?ThreadSafeString?:?public?string
            ?3{
            ?4public:
            ?5???ThreadSafeString(const?char*?s)?
            ?6???:?string(s)?{?}
            ?7???
            ?8???int?length();
            ?9private:
            10???LOCKER?lock;
            11}
            ;
            12
            The length method implementation is similar to the previous ones:
            ?1template?<class?LOCKER>
            ?2inline
            ?3int?ThreadSafeString<LOCKER>?::?length()
            ?4{
            ?5??lock.lock();
            ?6??int?len?=?string::length();
            ?7??lock.unlock();
            ?8
            ?9??return?len;
            10}
            If you want critical section protection, you will instantiate the template with a CriticalSectionLock:
            {
            ?? ThreadSafeString<CriticalSectionLock> csString = "Hello";
            ?? ...
            }
            or you may go with a mutex:
            {
            ?? ThreadSafeString<MutexLock> mtxString = "Hello";
            ?? ...
            }

            This design also provides a relief from the virtual function calls to lock() and unlock(). The declaration of a ThreadSafeString selects a particular type of synchronization upon template instantiation time. Just like hard coding, this enables the compiler to resolve the virtual calls and inline them.

            As you?can see, templates can make a positive performace contribution by pushing computations out of the excution-time and into compile-time, enabling inling in the process.

            posted on 2006-11-13 13:37 Zero Lee 閱讀(278) 評論(0)  編輯 收藏 引用 所屬分類: C++ Performance

            婷婷国产天堂久久综合五月| 久久99精品久久久久久野外| 久久久久一本毛久久久| 高清免费久久午夜精品| 色88久久久久高潮综合影院 | 亚洲AV伊人久久青青草原| 国产精久久一区二区三区| 久久久久久久尹人综合网亚洲| 亚洲精品乱码久久久久久按摩 | 日本国产精品久久| 久久久WWW成人| 久久久无码精品亚洲日韩软件| 久久精品无码av| 日韩影院久久| 麻豆久久久9性大片| 亚洲AV无码久久精品蜜桃| 久久亚洲私人国产精品| 丰满少妇人妻久久久久久| 2022年国产精品久久久久| 麻豆精品久久久一区二区| 999久久久免费国产精品播放| 18岁日韩内射颜射午夜久久成人| 久久这里只有精品首页| 久久国产成人亚洲精品影院| 亚洲欧洲精品成人久久曰影片 | 久久久久亚洲av无码专区导航| 日韩乱码人妻无码中文字幕久久 | 久久精品中文字幕无码绿巨人| 亚洲国产精品无码久久久蜜芽| 久久精品国产亚洲av高清漫画| 国内精品久久久久影院日本| 久久这里只有精品久久| 国产精品美女久久福利网站| 久久亚洲精品中文字幕| 品成人欧美大片久久国产欧美| 一本久久免费视频| 久久久精品国产sm调教网站| 国产午夜电影久久| 久久人妻AV中文字幕| 好属妞这里只有精品久久| 久久综合伊人77777麻豆|