编程语言
个人学习心得
小瓶子的笔记本
这个作者很懒,什么都没留下…
展开
-
【C++内存管理】内存管理实例 (一 ) —— 简单形式
内存管理无外乎希望提高两方面性能:提高运行效率。可以通过减少 malloc 函数调用的次数来提高运行效率。提高空间利用率。减少浪费。每次通过 new 分配的内存块上下两个部分都带有 cookie,记录着这块内存的大小等相关信息。可以通过分配一大块内存池,在将其中分为一小块一小块以供对象实例存放,这样的话,只在这一大块的头尾存在 cookie,中间部分省掉了很多 cookie 的占用内存,提高...原创 2020-04-18 17:47:19 · 590 阅读 · 1 评论 -
【C++内存管理】placement new 重载示例
可以为 operator new 写出多个重载版本,但是每一个版本的第一个参数都必须为 size_t 类型。其余的参数以 new 所指定的 placement arguements 为初值,出现在 new(…) 小括号里面的就是所谓的 placement arguements.比如我们可以继续为 Foo 类型写 operator new 重载:class Foo{public: Foo(...原创 2020-04-18 15:23:49 · 741 阅读 · 0 评论 -
【C++内存管理】operator new重载示例
可以对 operator new 进行重载,实现自己的内存分配方式和资源释放。下面是示例代码:class Foo{public: Foo() : _id(0) { cout << "default constructor. id = " << _id << endl; } Foo(int i) : _id(i) { cout <&l...原创 2020-04-18 09:54:02 · 371 阅读 · 0 评论 -
【C++内存管理】new expression
当我们用 new 去动态分配内存时:complex *pc = new complex(1, 2);编译器会为我们转为如下实现:complex *pc;try{ void *mem = operator new(sizeof(complex)); //allocate pc = static_cast<complex*>(mem); //cast pc->c...原创 2020-04-17 21:42:25 · 300 阅读 · 0 评论 -
【C++内存管理】placement new
placement new 允许我们在已有的内存上调用构造函数创建 object,如下用法://先分配内存char *buf = new char[sizeof(complex) * 3];//在 buf 指针所指的位置调用 complex 的构造函数,complex *pc = new(buf)complex(1, 2);...//释放内存delete[] buf;背后编译器...原创 2020-04-17 20:02:46 · 247 阅读 · 0 评论 -
【C++内存管理】array new 和 array delete
使用方法使用 new 加 [] 可以为数组分配内存,使用方法如下:Complex *pca = new Complex[3];这样的话,就分配了一块3个 Complex 大小的内存,并且分别调用三次 Complex 的默认构造函数。当不在使用这块内存时,需要搭配 delete[] 使用,它会先三次调用 Complex 的析构函数,然后将这块内存给释放掉:delete[] pca;...原创 2020-04-17 16:54:36 · 503 阅读 · 0 评论 -
C++ 11新特性(一)
【侯捷-C++11新特性-variadic templates】用例void print(){}template<typename T, typename... Types>void print(const T& firstArg, const Types&... args){ std::cout << "variadic params ...原创 2020-03-13 08:34:27 · 784 阅读 · 0 评论 -
C++ STL源码分析——tuple
【侯捷-SL体系结构内核分析-tuple】tuple也是一个容器,它可以将任意类型的数据组合在一起,形成一个容器对象,它可以用于函数返回多个值。定义对象如下:tuple<int, double, const char*> t1;可以在定义时可以直接初始化,也可以直接赋值:tuple<int, double, const char*> t1(12, 20.5, "z...原创 2020-03-07 22:00:55 · 545 阅读 · 0 评论 -
C++ STL源码分析——一个万用的 hash function
【侯捷-SL体系结构内核分析-一个万用的 hash function】我们知道,unordered_set / unordered_multiset / unordered_map / unordered_multimap 内部是用哈希表实现的,需要一个哈希函数来计算元素应该放在哪个 bucket 中。对于基本的数据类型,比如 int, float, double, string等,STL为我们...原创 2020-03-07 18:28:59 · 1906 阅读 · 4 评论 -
C++ STL源码分析——适配器之流适配器
【侯捷-SL体系结构内核分析-适配器】ostream_iteratoristream_iteratorostream_iterator先来看看一段使用代码:void main(){ vector<int> vec = { 1, 2, 3, 4, 5 }; std::ostream_iterator<int> o_it(std::cout, ",");...原创 2020-03-06 21:02:31 · 265 阅读 · 0 评论 -
C++ STL源码分析——适配器之迭代器适配器
【侯捷-SL体系结构内核分析-适配器】什么是逆向迭代器容器除了拥有返回正向迭代器的函数 begin 和 end 之外,还有两个类似的成员函数 rbegin 和 rend,它们返回的是容器的逆向迭代器,它们之间的相互关系如下:begin() 返回指向容器头元素的正向迭代器;end() 返回指向容器尾元素的下一个位置的正向迭代器。rbegin() 返回指向容器尾元素的逆向迭代器;rend(...原创 2020-03-06 12:52:48 · 286 阅读 · 0 评论 -
C++ STL源码分析——适配器之仿函数适配器 bind2nd 以及 bind
【侯捷-SL体系结构内核分析-适配器】bind2nd 为二元函数适配器,指定二元函数的第二个参数,将二元函数转变为一元函数。比如下面这个例子:int main(){ vector<int> vec = vector<int>{ 4, 5 ,6 ,3, 5 ,8 ,3 }; int count = count_if(vec.begin(), vec.end(), b...原创 2020-03-03 08:03:53 · 395 阅读 · 1 评论 -
C++ STL源码分析——仿函数
【侯捷-SL体系结构内核分析-仿函数】STL提供的标准仿函数可以分为三类:算数类、逻辑运算类和相对关系类。算术类,比如 plus, minus等逻辑运算类,比如 logical_and相对关系类,比如equal_to, lessSTL规定,当自己写仿函数来配合 algorithm 操作时,为达到仿函数的 可适配(adaptable)的条件,仿函数必须继承 unary_function...原创 2020-03-02 16:45:59 · 273 阅读 · 0 评论 -
C++ STL源码分析——算法(二)
【侯捷-SL体系结构内核分析-算法】目录:count, count_iffind, find_ifsortcount, count_ifcount 源码template<class _InIt, class _Ty> _NODISCARD inline _Iter_diff_t<_InIt> count(const _InIt _First, cons...原创 2020-03-02 12:32:34 · 505 阅读 · 0 评论 -
C++ STL源码分析——算法(一)
accumulate原创 2020-03-01 20:16:07 · 552 阅读 · 0 评论 -
C++ STL源码分析——iterator分类
【侯捷-SL体系结构内核分析-iterator】itertor需要向algorithm提供自身的类型 iterator_category,iterator分为以下五种类型:random_access_iterator_tag,可跨任意距离取值bidirectional_iterator_tag,可前进或后退forward_iterator_taginput_iterator_tago...原创 2020-02-29 08:18:16 · 463 阅读 · 0 评论 -
C++ STL源码分析——map和multimap
【侯捷-SL体系结构内核分析-map和multimap探索】map和multimap底层同样以红黑树_Tree作为支撑,关于红黑树_Tree可以看看我的这篇文章:C++ STL源码分析——set和multiset_Traits参数map和multimap的红黑树_Traits参数如下:template<class _Kty, // key type class _Ty, // ma...原创 2020-02-24 16:58:31 · 649 阅读 · 0 评论 -
C++ STL源码分析——set和multiset
STL中assosiated container 比如 set 和 multiset 底层都是由红黑树作为支撑实现,所以在了解他们之前,有必要先来了解一下红黑树。在这里插入代码片原创 2020-02-22 20:32:01 · 525 阅读 · 0 评论 -
C++ STL源码分析—queue和stack
【侯捷-SL体系结构内核分析-queue和stack探索】总结queue和stack底层默认是由deque实现,所有某种程度上queue和stack不被称为容器,而可以被称为容器queue的adapter。template<class _Ty, class _Container = deque<_Ty> > class queue { // FIFO que...原创 2020-02-19 16:16:53 · 767 阅读 · 0 评论 -
C++ STL源码分析—deque
容器类成员变量包装类 _XXX_valtemplate<class _Val_types> class _Deque_val : public _Container_base12 { // base class for deque to hold datapublic: using value_type = typename _Val_types::value_type;...原创 2020-02-19 15:28:23 · 823 阅读 · 1 评论 -
C++ STL容器源码—forward_list
【侯捷-SL体系结构内核分析-forward_list探索】以forward_list为例,分析源码框架。容器类成员变量包装类 _XX_val其中,变量 _Myhead就是forward_list的头指针。容器类继承关系_Flist_alloc类容器allocator的基类,其中含有数据成员_Flist_val。2. _Flist_buy类继承自_Flist_alloc类...原创 2020-02-14 20:54:31 · 299 阅读 · 0 评论 -
vector容量增长方式
【侯捷-SL体系结构内核分析-vector探索】查看vs2017中vector源码时,发现vs中vector容量的扩充并不是2 * oldCapacity的增长方式,而是oldCapacity + oldCapacity / 2的增长方式,相关源代码如下: size_type _Calculate_growth(const size_type _Newsize) const { // g...原创 2020-02-14 15:23:44 · 294 阅读 · 0 评论