• <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 閱讀(284) 評論(0)  編輯 收藏 引用 所屬分類: C++ Performance

            久久Av无码精品人妻系列| 久久久久久人妻无码| 久久有码中文字幕| 久久久久波多野结衣高潮| 一本久久a久久精品亚洲| 久久久九九有精品国产| 久久天天日天天操综合伊人av| 狠狠色婷婷久久一区二区| 成人妇女免费播放久久久| 国产精品99久久精品爆乳| 99久久精品免费看国产一区二区三区| 久久亚洲私人国产精品| 久久久久国产一区二区| 久久久久亚洲av无码专区喷水 | 精品免费久久久久久久| 久久97久久97精品免视看秋霞| 亚洲国产另类久久久精品小说 | 久久精品夜色噜噜亚洲A∨| 伊人久久精品无码av一区| 久久黄视频| 99久久精品日本一区二区免费| 一本久久综合亚洲鲁鲁五月天| 久久香蕉综合色一综合色88| 久久亚洲精品国产精品| 亚洲伊人久久大香线蕉综合图片| 99久久国产免费福利| 久久99国产精品久久久| 久久亚洲春色中文字幕久久久| 久久久久亚洲AV成人网人人网站 | 女同久久| 四虎国产精品成人免费久久| 国产综合成人久久大片91| 国产精品久久久久影院嫩草| 欧美噜噜久久久XXX| 日韩av无码久久精品免费| 欧美日韩精品久久免费| 亚洲伊人久久成综合人影院 | 国内精品伊人久久久久妇| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久久亚洲AV无码专区首JN | 国产成人精品三上悠亚久久|