STL学习之二:STL内存工具(一)
用Traits进行类别推导,将类别选择工作放到编译期进行,利用重载提高效率。
下面的type_traits.h是我直接从SGI STL里Copy出来的。。。
#ifndef TYPE_TRAITS_H
#define TYPE_TRAITS_H
// 为了了重载确定那些类弄型是不用析构的SGI STl用了type_traits
// 并将一些Scale type进行特例化
struct __true_type {
} ;
struct __false_type {
} ;
template < class _Tp >
struct __type_traits {
typedef __true_type this_dummy_member_must_be_first;
typedef __false_type has_trivial_default_constructor;
typedef __false_type has_trivial_copy_constructor;
typedef __false_type has_trivial_assignment_operator;
typedef __false_type has_trivial_destructor;
typedef __false_type is_POD_type;
} ;
template <>
struct __type_traits < bool > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < char > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < signed char > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned char > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < wchar_t > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < short > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned short > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < int > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned int > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
#ifdef __STL_LONG_LONG
template <>
struct __type_traits < long long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
struct __type_traits < unsigned long long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
#endif /* __STL_LONG_LONG */
template <>
struct __type_traits < float > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < double > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < long double > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template < class _Tp >
struct __type_traits < _Tp *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < signed char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < const char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < const signed char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < const unsigned char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
#endif
#define TYPE_TRAITS_H
// 为了了重载确定那些类弄型是不用析构的SGI STl用了type_traits
// 并将一些Scale type进行特例化
struct __true_type {
} ;
struct __false_type {
} ;
template < class _Tp >
struct __type_traits {
typedef __true_type this_dummy_member_must_be_first;
typedef __false_type has_trivial_default_constructor;
typedef __false_type has_trivial_copy_constructor;
typedef __false_type has_trivial_assignment_operator;
typedef __false_type has_trivial_destructor;
typedef __false_type is_POD_type;
} ;
template <>
struct __type_traits < bool > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < char > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < signed char > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned char > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < wchar_t > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < short > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned short > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < int > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned int > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
#ifdef __STL_LONG_LONG
template <>
struct __type_traits < long long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
struct __type_traits < unsigned long long > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
#endif /* __STL_LONG_LONG */
template <>
struct __type_traits < float > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < double > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < long double > {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template < class _Tp >
struct __type_traits < _Tp *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < signed char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < unsigned char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < const char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < const signed char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
template <>
struct __type_traits < const unsigned char *> {
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
} ;
#endif
以下是construct 和 destroy的实现
#ifndef MEM_TOOlS_H
#define MEM_TOOlS_H
#include " type_traits.h "
using namespace std;
namespace SGI
{
template<typename T1, typename T2>
inline void construct(T1* p, const T2& value)
{
new(p)T1(value);
}
template<typename T>
inline void construct(T* p)
{
new(p)T();
}
template<typename T>
void destroy(T* p)
{
p->~T();
}
template<typename ForwardIterator>
inline void destroy_aux(ForwardIterator first, ForwardIterator last, __false_type)
{
for (; first < last; ++first)
destroy(&*first);
cout << "false type" << endl;
}
template<typename ForwardIterator>
inline void destroy_aux(ForwardIterator first, ForwardIterator last, __true_type)
{
cout << "true type" << endl;
}
template<typename ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last)
{
_destroy(first, last, value_type(*first));
}
template<typename ForwardIterator, typename T>
inline void _destroy(ForwardIterator first, ForwardIterator last, T*)
{
typedef __type_traits<T>::has_trivial_destructor trivial_destructor;
destroy_aux(first, last, trivial_destructor());
}
inline void destroy(char*, char*)
{
cout << "char* type" << endl;
}
inline void destroy(wchar_t*, wchar_t*)
{
cout << "wchar_t* type" << endl;
}
}
#endif
#define MEM_TOOlS_H
#include " type_traits.h "
using namespace std;
namespace SGI
{
template<typename T1, typename T2>
inline void construct(T1* p, const T2& value)
{
new(p)T1(value);
}
template<typename T>
inline void construct(T* p)
{
new(p)T();
}
template<typename T>
void destroy(T* p)
{
p->~T();
}
template<typename ForwardIterator>
inline void destroy_aux(ForwardIterator first, ForwardIterator last, __false_type)
{
for (; first < last; ++first)
destroy(&*first);
cout << "false type" << endl;
}
template<typename ForwardIterator>
inline void destroy_aux(ForwardIterator first, ForwardIterator last, __true_type)
{
cout << "true type" << endl;
}
template<typename ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last)
{
_destroy(first, last, value_type(*first));
}
template<typename ForwardIterator, typename T>
inline void _destroy(ForwardIterator first, ForwardIterator last, T*)
{
typedef __type_traits<T>::has_trivial_destructor trivial_destructor;
destroy_aux(first, last, trivial_destructor());
}
inline void destroy(char*, char*)
{
cout << "char* type" << endl;
}
inline void destroy(wchar_t*, wchar_t*)
{
cout << "wchar_t* type" << endl;
}
}
#endif
在main中对construct,destroy时行测试
//
mem_tools.cpp : 定义控制台应用程序的入口点。
//
/**/ /*
* 模仿实现SGI STL中的内存工具
* szwolf @ szu
* 2006.08.07
*/
#include " stdafx.h "
#include " sgi_allocator.h "
#include < iostream >
#include < vector >
#include < algorithm >
#include " mem_tools.h "
class mem_test
{
public:
mem_test(const char* msg)
{
cout << msg << endl;
}
~mem_test()
{
cout << "dead~~" << endl;
}
} ;
int _tmain( int argc, _TCHAR * argv[])
{
// 很郁闷为什么下面的代码是错的?
// typedef simple_alloc<mem_test, SGI::alloc> data_allcator;
// mem_test* t = data_allocator::allocate();
SGI::simple_alloc<mem_test, SGI::alloc> data_allocator;
mem_test* t = data_allocator.allocate();
SGI::construct(t, "come to live!");
SGI::destroy(&*t);
SGI::simple_alloc<char, SGI::alloc> char_alloc;
char *p = char_alloc.allocate(133);
strcpy(p, "hellow!");
SGI::destroy(p,p+8);
char_alloc.deallocate(p, 133);
system("pause");
return 0;
}
实中用到的simple_alloc及sgi_allocator.h是上一篇随笔里的东西。。。
//
/**/ /*
* 模仿实现SGI STL中的内存工具
* szwolf @ szu
* 2006.08.07
*/
#include " stdafx.h "
#include " sgi_allocator.h "
#include < iostream >
#include < vector >
#include < algorithm >
#include " mem_tools.h "
class mem_test
{
public:
mem_test(const char* msg)
{
cout << msg << endl;
}
~mem_test()
{
cout << "dead~~" << endl;
}
} ;
int _tmain( int argc, _TCHAR * argv[])
{
// 很郁闷为什么下面的代码是错的?
// typedef simple_alloc<mem_test, SGI::alloc> data_allcator;
// mem_test* t = data_allocator::allocate();
SGI::simple_alloc<mem_test, SGI::alloc> data_allocator;
mem_test* t = data_allocator.allocate();
SGI::construct(t, "come to live!");
SGI::destroy(&*t);
SGI::simple_alloc<char, SGI::alloc> char_alloc;
char *p = char_alloc.allocate(133);
strcpy(p, "hellow!");
SGI::destroy(p,p+8);
char_alloc.deallocate(p, 133);
system("pause");
return 0;
}