C++ STL源码——stl_construct.h
来源:互联网 发布:凯里欧文数据 编辑:程序博客网 时间:2024/06/05 00:51
本文节转自:http://www.cnblogs.com/lfsblack/archive/2012/11/10/2764334.html
stl_construct.h// Filename: stl_construct.h// Comment By: 凝霜// E-mail: mdl2009@vip.qq.com// Blog: http://blog.csdn.net/mdl13412/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * * Copyright (c) 1996,1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. *//* NOTE: This is an internal header file, included by other STL headers. * You should not attempt to use it directly. */#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H#define __SGI_STL_INTERNAL_CONSTRUCT_H#include <new.h> // 需要placement new的原型__STL_BEGIN_NAMESPACE// 调用成员的析构函数, 需要类型具有non-trivial destructortemplate <class T>inline void destroy(T* pointer){ pointer->~T();}// 使用placement new在已经分配的内存上构造对象// 如果你不熟悉placement new, 请参考// http://msdn.microsoft.com/en-us/library/kewsb8ba.aspx// http://blogs.msdn.com/b/jaredpar/archive/// 2007/10/16/c-new-operator-and-placement-new.aspxtemplate <class T1, class T2>inline void construct(T1* p, const T2& value){ new (p) T1(value);}// 析构一组对象, 用于具有non-trivial destructortemplate <class ForwardIterator>inline void__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type){ for ( ; first < last; ++first) destroy(&*first);}// 如果没有类型non-trivial destructor, 则使用此函数template <class ForwardIterator>inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}// 使用traits技术, 判断类型是否就有non-trivial destructor, 然后调用不同的函数template <class ForwardIterator, class T>inline void __destroy(ForwardIterator first, ForwardIterator last, T*){ typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor; __destroy_aux(first, last, trivial_destructor());}////////////////////////////////////////////////////////////////////////////////// 用于销毁一组对象////////////////////////////////////////////////////////////////////////////////// char *特化版本// ---------- destroy不进行析构// |// destroy(first, last) -------------------------- 特化// | |// | 泛化 ----------- destroy不进行析构// | wchar_t *特化版本// ↓// 调用 __destroy(first, last, value_type(first));// 根据是否具有trivial destructor进行函数转发// |// |---------------- has trivial destructor?// |// -------------------------------------------// No | | Yes// | |// ↓ ↓// __destroy_aux(..., __true_type) __destroy_aux(..., __false_type)// 不进需要行析构操作 for ( ; first < last; ++first)// destroy(&*first);////////////////////////////////////////////////////////////////////////////////template <class ForwardIterator>inline void destroy(ForwardIterator first, ForwardIterator last){ __destroy(first, last, value_type(first));}// 特化版本inline void destroy(char*, char*) {}inline void destroy(wchar_t*, wchar_t*) {}__STL_END_NAMESPACE#endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */// Local Variables:// mode:C++// End:
阅读全文
0 0
- C++ STL源码——stl_construct.h
- 《STL源码剖析》-- stl_construct.h
- 《STL源码剖析》--<stl_construct.h>
- 《STL源码剖析》---stl_construct.h阅读笔记
- stl stl_construct.h 要点
- STL源码剖析 [特殊的空间配置器](对象构造和析构stl_construct.h)
- stl_construct.h
- 《STL源码剖析》—— stl_config.h
- STL源码剖析——stl_tree.h
- STL源码剖析——stl_numeric.h
- STL源码剖析——stl_algobase.h
- STL源码剖析——STL算法stl_algo.h
- STL源码剖析——stl_pair.h学习
- STL源码剖析——stl_hash_fun.h学习
- STL源码剖析——数值算法stl_numeric.h
- STL源码剖析——stl_relops.h学习
- STL源码剖析——基本算法stl_algobase.h
- C++ STL源码剖析——stl_config.h
- Python入门深度学习完整指南
- 电阻相关知识
- Eclipse中修改SVN用户名和密码方法
- LeetCode714. Best Time to Buy and Sell Stock with Transaction Fee
- 微信长按识别二维码的原理
- C++ STL源码——stl_construct.h
- jQuery插件之ajaxFileUpload(异步上传图片并实时显示,并解决onchange后ajaxFileUpload失效问题)
- 剑指offer 替换空格
- JAVA_编程小案例_数字排序
- 【设计模式】(1)--设计模式初探
- 【Caffe踩坑超有用记录】Ubuntu 15.10/16.04 上安装Caffe——确保编译好的库相互兼容
- 使用Base64编解码
- 如何在Spark平台搭建ThriftServer
- curl错误码对应的中英文解释