前言

在某些项目开发中,经常会遇到需要频繁创建和销毁某些资源的情况。这些资源可能是内存、线程、数据库连接等。频繁地创建和销毁资源可能导致性能下降和资源浪费。为了解决这些问题,设计了一种称为“池技术”的策略。简单而言,就是预先创建一组资源,如内存、线程等,每次需要用时从池中取出一个资源,用完再放回去,因此采用**“池技术”使程序的效率更高**。典型的用空间换时间的方法。

1. 预备知识

1.1 C++11 std::shared_ptr

std::shared_ptr是一种智能指针,它能够记录多少个 shared_ptr 共同指向一个对象,从而消除显式的调用 delete,每多一个shared_ptr指向同一个对象,该对象的计数就会+1,当引用计数变为零的时候就会将对象自动删除

两种初始化方式

  1. shared_ptr<int> sp1 (new int(10)); //通过new构造数据对象
  2. shared_ptr<int> sp2(make_shared<int>(10)); //通过make_shared构造数据对象

其区别:

  1. make_shared分配一次内存,智能指针控制块和管理的对象存在同一块内存里。new初始化智能指针需要调用两次内存分配,一次给控制块分配内存,一次给对象分配内存,这两个东西是不连续的,会造成内存碎片化
  2. 在C++ 11中因为make_sharedstd::move语义,在加上O2优化选项的时候,make_shared会比new快上将近1倍

1.2 C++11 Lambda表达式

Lambda表达式是C++11中新增的一种函数对象,它可以方便地定义一个匿名函数,从而简化代码的编写。Lambda表达式的本质是一个可调用对象,可以像函数一样被调用,也可以作为函数参数或返回值。

详解参考:

【C++】 Lambda表达式详解_c++ lambda-CSDN博客

1.3 C++11 std::move

C++11引入了右值引用和移动语义,为了提高性能和避免不必要的拷贝。右值引用是一种特殊的引用,它可以绑定到一个临时对象或者将要销毁的对象,从而可以将其资源转移给另一个对象。移动语义是一种利用右值引用实现的编程技巧,它可以让一个对象从另一个对象“窃取”资源,而不是进行深拷贝。

详解参考:

详解C++移动语义std::move()-CSDN博客

2. 线程池