• <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的專欄

            關于STL allocator

            關于STL 中allocator的接口與實現,C++標準有比較清楚的定義:
            http://en.wikipedia.org/wiki/Allocator_(C%2B%2B) 

            1. 在GNU C++中,STL allocator嚴格遵守C++的標準:
            看一下的代碼:(定義在bits/allocator.h文件中)
             1 namespace std
             2 {
             3   template<typename _Tp>
             4     class allocator;
             5 
             6   template<>
             7     class allocator<void>
             8     {
             9     public:
            10       typedef size_t      size_type;
            11       typedef ptrdiff_t   difference_type;
            12       typedef void*       pointer;
            13       typedef const void* const_pointer;
            14       typedef void        value_type;
            15 
            16       template<typename _Tp1>
            17         struct rebind
            18         { typedef allocator<_Tp1> other; };
            19     };
            20 
            21   /**
            22    *  @brief  The "standard" allocator, as per [20.4].
            23    *
            24    *  (See @link Allocators allocators info @endlink for more.)
            25    */
            26   template<typename _Tp>
            27     class allocator: public ___glibcxx_base_allocator<_Tp>
            28     {
            29    public:
            30       typedef size_t     size_type;
            31       typedef ptrdiff_t  difference_type;
            32       typedef _Tp*       pointer;
            33       typedef const _Tp* const_pointer;
            34       typedef _Tp&       reference;
            35       typedef const _Tp& const_reference;
            36 
            37       typedef _Tp        value_type;
            38 
            39       template<typename _Tp1>
            40         struct rebind
            41         { typedef allocator<_Tp1> other; };
            42 
            43       allocator() throw() { }
            44 
            45       allocator(const allocator& a) throw()
            46       : ___glibcxx_base_allocator<_Tp>(a) { }
            47 
            48       template<typename _Tp1>
            49         allocator(const allocator<_Tp1>&) throw() { }
            50 
            51       ~allocator() throw() { }
            52 
            53       // Inherit everything else.
            54     };
            55 
            56   template<typename _T1, typename _T2>
            57     inline bool
            58     operator==(const allocator<_T1>&, const allocator<_T2>&)
            59     { return true; }
            60 
            61   template<typename _T1, typename _T2>
            62     inline bool
            63     operator!=(const allocator<_T1>&, const allocator<_T2>&)
            64     { return false; }
            65 
            66   // Inhibit implicit instantiations for required instantiations,
            67   // which are defined via explicit instantiations elsewhere.
            68   // NB: This syntax is a GNU extension.
            69 #if _GLIBCXX_EXTERN_TEMPLATE
            70   extern template class allocator<char>;
            71 
            72   extern template class allocator<wchar_t>;
            73 #endif
            74 
            75   // Undefine.
            76 #undef ___glibcxx_base_allocator
            77 } // namespace std
            78 

            template ___glibcxx_base_allocator 定義在具體的平臺相關的頭文件中,例如i386-redhat-linux/bits/c++allocator.h:
            可以看出GNU c++的allocator其實采用的是new/delete-based allocation.

             1 namespace __gnu_cxx
             2 {
             3   /**
             4    *  @brief  An allocator that uses global new, as per [20.4].
             5    *
             6    *  This is precisely the allocator defined in the C++ Standard.
             7    *    - all allocation calls operator new
             8    *    - all deallocation calls operator delete
             9    *
            10    *  (See @link Allocators allocators info @endlink for more.)
            11    */
            12   template<typename _Tp>
            13     class new_allocator
            14     {
            15     public:
            16       typedef size_t     size_type;
            17       typedef ptrdiff_t  difference_type;
            18       typedef _Tp*       pointer;
            19       typedef const _Tp* const_pointer;
            20       typedef _Tp&       reference;
            21       typedef const _Tp& const_reference;
            22       typedef _Tp        value_type;
            23 
            24       template<typename _Tp1>
            25         struct rebind
            26         { typedef new_allocator<_Tp1> other; };
            27 
            28       new_allocator() throw() { }
            29 
            30       new_allocator(const new_allocator&) throw() { }
            31 
            32       template<typename _Tp1>
            33         new_allocator(const new_allocator<_Tp1>&) throw() { }
            34 
            35       ~new_allocator() throw() { }
            36 
            37 
            38       pointer
            39       address(reference __x) const { return &__x; }
            40 
            41       const_pointer
            42       address(const_reference __x) const { return &__x; }
            43 
            44       // NB: __n is permitted to be 0.  The C++ standard says nothing
            45       // about what the return value is when __n == 0.
            46       pointer
            47       allocate(size_type __n, const void* = 0)
            48       { return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); }
            49 
            50       // __p is not permitted to be a null pointer.
            51       void
            52       deallocate(pointer __p, size_type)
            53       { ::operator delete(__p); }
            54 
            55       size_type
            56       max_size() const throw()
            57       { return size_t(-1) / sizeof(_Tp); }
            58 
            59       // _GLIBCXX_RESOLVE_LIB_DEFECTS
            60       // 402. wrong new expression in [some_] allocator::construct
            61       void
            62       construct(pointer __p, const _Tp& __val)
            63       { ::new(__p) _Tp(__val); }
            64 
            65       void
            66       destroy(pointer __p) { __p->~_Tp(); }
            67     };
            68 
            69   template<typename _Tp>
            70     inline bool
            71     operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
            72     { return true; }
            73 
            74 
            75   template<typename _Tp>
            76     inline bool
            77     operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
            78     { return false; }
            79 } // namespace __gnu_cxx
            80 

            posted on 2012-06-17 10:37 Zero Lee 閱讀(526) 評論(0)  編輯 收藏 引用

            久久99精品久久久大学生| 无码人妻少妇久久中文字幕蜜桃| 日韩精品久久无码中文字幕| 91久久精一区二区三区大全| 久久99国产精品久久久| 性欧美大战久久久久久久| 久久夜色精品国产网站| 日本久久中文字幕| 久久免费的精品国产V∧| 性做久久久久久久久老女人| 国产亚洲精久久久久久无码| 久久婷婷色香五月综合激情| 国产国产成人久久精品| 国产精品99久久精品| 久久99亚洲网美利坚合众国| 精品久久久无码人妻中文字幕豆芽 | 欧洲人妻丰满av无码久久不卡| 伊人色综合久久天天网| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 国产真实乱对白精彩久久| 99久久精品费精品国产一区二区| 精品久久久无码人妻中文字幕豆芽| 99久久人妻无码精品系列| 国产高潮久久免费观看| 久久伊人亚洲AV无码网站| 久久久久久久精品成人热色戒| 亚洲色大成网站www久久九| 久久免费的精品国产V∧| 四虎国产精品免费久久5151 | 亚洲国产精品久久久久婷婷软件 | 国产精品内射久久久久欢欢| 欧美激情精品久久久久久| 无码日韩人妻精品久久蜜桃| 国产高潮久久免费观看| 精品久久人人爽天天玩人人妻| 久久精品国产福利国产秒| 久久精品极品盛宴观看| 精品久久久久久无码免费| 九九99精品久久久久久| 久久久久久人妻无码| 波多野结衣中文字幕久久 |