侯老師--STL原始碼剖析--書中的疑問二 (轉)
:namespace prefix = o ns = "urn:schemas--com::office" />
侯老師--STL原始碼剖析--書中的錯誤二
前言
我在看侯捷的STL原始碼剖析一書中”第二章設計一個陽春的空間器JJ::allocator(第45頁)看到了如下的虛擬碼,我認為是有錯誤的,程式碼如下:
名稱空間JJ中程式碼
……
template
inline void _construct(T1* p, const T2& value)
{
new(p) T1(value);
}
……
template
class allocator
{
……
typedef T* pointer;
……
void construct(pointer p, const T& value)
{
_construct(p,value);
}
……
}
現在讓我們假設使用allocator
SGI的STL原始碼
template
struct __allocator {
_Alloc __underlying_alloc;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template
typedef __allocator<_tp1 _alloc=""> other;
};
__allocator() __STL_NOTHROW {}
__allocator(const __allocator& __a) __STL_NOTHROW
: __underlying_alloc(__a.__underlying_alloc) {}
template
__allocator(const __allocator<_tp1 _alloc="">& __a) __STL_NOTHROW
: __underlying_alloc(__a.__underlying_alloc) {}
~__allocator() __STL_NOTHROW {}
pointer address(reference __x) const { return &__x; }
const_pointer address(const_reference __x) const { return &__x; }
// __n is petted to be 0.
_Tp* allocate(size_type __n, const void* = 0) {
return __n != 0
? static_cast<_tp>(__underlying_alloc.allocate(__n * sizeof(_Tp)))
: 0;
}
// __p is not permitted to be a null pointer.
void deallocate(pointer __p, size_type __n)
{ __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); }
size_type max_size() const __STL_NOTHROW
{ return size_t(-1) / sizeof(_Tp); }
void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
void destroy(pointer __p) { __p->~_Tp(); }
};
注意加黑部分,原始碼中用的是__Tp(就是value_type),所以侯老師的_construct函式應改為如下定義:
template
inline void _construct(T1 p, const T2& value)
{
new(p) T2(value);
}
首先宣告一下,我是非常非常崇拜侯老師的,侯老師的書寫的真的十分的棒,所以才看的仔細,但是這不代表我說的一定對,侯老師一定寫錯了。我只是把我個人的觀點寫出來,請大家批評指教,共同進步嗎!如果能夠得到侯老師的指點是再好不過了^_^。
總之,請大家多多批評指教,來信至to:來信至ccplusplus@21cn.com">ccplusplus@21cn.com。
致謝!
袁凱
2001-11-13
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 侯老師--STL原始碼剖析--書中的疑問三 (轉)原始碼
- 侯老師--STL原始碼剖析--書中的疑問一 (轉)原始碼
- 《STL原始碼剖析》-- memory原始碼
- 《STL原始碼剖析》 -- stl_algo.h原始碼Go
- 《STL原始碼剖析》-- stl_algobase.h原始碼Go
- 《STL原始碼剖析》-- stl_hashtable.h原始碼
- 《STL原始碼剖析》-- stl_multimap.h原始碼
- 《STL原始碼剖析》-- stl_map.h原始碼
- 《STL原始碼剖析》-- stl_multiset.h原始碼
- 《STL原始碼剖析》-- stl_set.h原始碼
- 《STL原始碼剖析》-- stl_tree.h原始碼
- 《STL原始碼剖析》-- stl_heap.h原始碼
- 《STL原始碼剖析》-- stl_slist.h原始碼
- 《STL原始碼剖析》-- stl_queue.h原始碼
- 《STL原始碼剖析》-- stl_stack.h原始碼
- 《STL原始碼剖析》-- stl_deque.h原始碼
- 《STL原始碼剖析》-- stl_list.h原始碼
- 《STL原始碼剖析》-- stl_pair.h原始碼AI
- 《STL原始碼剖析》-- stl_vector.h原始碼
- 《STL原始碼剖析》-- stl_iterator.h原始碼
- 《STL原始碼剖析》-- stl_uninitialized.h原始碼Zed
- 《STL原始碼剖析》-- stl_alloc.h原始碼
- STL原始碼剖析——vector容器原始碼
- 《STL原始碼剖析》-- stl_relops.h原始碼
- 《STL原始碼剖析》-- stl_hash_map.h原始碼
- 《STL原始碼剖析》-- stl_hash_set.h原始碼
- 《STL原始碼剖析》-- stl_construct.h原始碼Struct
- 《STL原始碼剖析》-- stl_config.h原始碼
- 《STL原始碼剖析》-- defalloc.h原始碼
- 《STL原始碼剖析》 -- 寫在最後原始碼
- 《STL原始碼剖析》-- 特別說明原始碼
- 《STL原始碼剖析》-- type_traits.h原始碼AI
- Jive原始碼的疑問原始碼
- SDWebImage原始碼剖析(二)Web原始碼
- 【STL 原始碼剖析】淺談 STL 迭代器與 traits 程式設計技法原始碼AI程式設計
- C++(STL原始碼):37---仿函式(函式物件)原始碼剖析C++原始碼函式物件
- jQuery原始碼剖析 (二) - 選擇器jQuery原始碼
- SpringMVC原始碼剖析(二)- DispatcherServlet的前世今生SpringMVC原始碼Servlet