• <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国产精品导航| 四虎影视久久久免费| 久久精品国产清高在天天线| 久久久久无码精品国产不卡| 99久久精品国产毛片| 天堂无码久久综合东京热| 久久精品国产免费观看 | 精品久久久久久亚洲| 一级做a爰片久久毛片人呢| 欧美日韩精品久久久免费观看| 午夜精品久久久久久99热| 模特私拍国产精品久久| 精品国产乱码久久久久久1区2区| 99久久无码一区人妻| 亚洲va中文字幕无码久久不卡 | 99久久精品国产综合一区| 无码国内精品久久综合88| 久久综合综合久久97色| 一本久久精品一区二区| 伊人久久综在合线亚洲2019| 亚洲综合伊人久久综合| 久久久久国色AV免费看图片| 久久99精品国产麻豆宅宅| 久久精品国产亚洲av麻豆蜜芽 | 久久99亚洲网美利坚合众国| 热久久视久久精品18| 99热都是精品久久久久久| 久久99精品久久久久久hb无码| 久久久久99这里有精品10| 欧美日韩精品久久久免费观看| 99久久精品国产一区二区蜜芽| 国产精品一区二区久久| 久久久久99精品成人片欧美 | 国产精品99久久久精品无码| 久久久久久无码国产精品中文字幕 | 久久精品九九亚洲精品天堂| 人妻无码久久一区二区三区免费| 国产精品亚洲综合久久| 人人狠狠综合88综合久久| 久久久久久久久久久免费精品| 久久91精品国产91久久麻豆|