• <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

            久久亚洲国产精品五月天婷| 性高湖久久久久久久久AAAAA| 亚洲伊人久久成综合人影院 | 精品国产99久久久久久麻豆| 国内精品免费久久影院| 国产91久久综合| 波多野结衣久久精品| 亚洲国产精品无码成人片久久| 狠狠色丁香久久婷婷综合图片| 亚洲人成无码网站久久99热国产| 人妻无码久久精品| 欧美亚洲另类久久综合| 一本色道久久HEZYO无码| 美女久久久久久| 嫩草影院久久国产精品| 久久久久亚洲精品日久生情 | 九九精品久久久久久噜噜| 色综合久久夜色精品国产| 99久久er这里只有精品18| 久久精品国产男包| 久久久久女教师免费一区| 9191精品国产免费久久| AAA级久久久精品无码片| 久久婷婷五月综合国产尤物app | 色播久久人人爽人人爽人人片aV| 青青青青久久精品国产h| 亚洲国产精品久久久久网站| 国产精品一久久香蕉产线看| 69SEX久久精品国产麻豆| 69久久夜色精品国产69| 大美女久久久久久j久久| 亚洲国产精品无码久久青草| 中文字幕久久精品| 亚洲人成精品久久久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品久久久久久| 女同久久| 伊人热人久久中文字幕| 中文字幕久久精品无码| 久久综合视频网站| 99精品久久久久久久婷婷|