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

            国产精品美女久久久免费| 久久精品国产第一区二区三区| 国产91色综合久久免费分享| 97久久天天综合色天天综合色hd| 国产精品久久久久乳精品爆| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久久久亚洲精品无码| 波多野结衣久久一区二区| 国产人久久人人人人爽| 久久久久国产精品麻豆AR影院 | 精品久久久久中文字幕一区| 亚洲国产精品无码久久久久久曰| 97精品久久天干天天天按摩| 久久久久久久综合日本| 国产精品福利一区二区久久| 久久久久久精品无码人妻| 草草久久久无码国产专区| 久久久久人妻精品一区二区三区| 欧美日韩成人精品久久久免费看| 国产成人久久精品区一区二区| 日本久久中文字幕| 国产成人99久久亚洲综合精品 | 精品久久久久久无码国产| 久久成人国产精品| 国内高清久久久久久| 色8激情欧美成人久久综合电| 国产精品久久久久久| 成人国内精品久久久久一区| 久久狠狠爱亚洲综合影院| 久久笫一福利免费导航| 99久久免费国产精品特黄| 一本大道久久东京热无码AV| 无码8090精品久久一区| 久久久久香蕉视频| 少妇久久久久久被弄到高潮 | 亚洲国产精品久久66| 99久久中文字幕| 2021精品国产综合久久| 日本精品久久久久中文字幕| 久久亚洲国产中v天仙www| 精品久久人人做人人爽综合|