今天在分析threadsafe_stack代码时发现自己对pop和push的具体实现原理以及注意事项还是有点疏漏,然后撸了一遍相关标准库代码,记录一下。
先说结论:

  1. pop与erase只是移动指针,不会删除内存,但是会调用该位置的析构函数,所以直接用变量引用这块内存是可以的,且不会出错
  2. emplace与push如果都是传入右值,那么实际使用上的区别就是emplace的不会调用析构函数,push进去的会调用析构函数
  3. move拷贝完了,原来的对象是会析构的

pop与erase

下图为vector< T>的pop_back的调用关系,其内部只是将M_impl._M_finish指针- -,然后调用该T的析构函数。并未完成该对象在该内存的清理,所以后续可以通过指针与引用对该地址进行操作。erase同理,内部函数调用比较类似。

emplace与push

emplace与push两者如果传入的是右值,则都是调用emplace_back
区别在于两者在placement_new那个点调用的构造函数不同,前者是调用构造函数,后者调用拷贝构造函数,所以push之后是需要调用析构,而emplace不需要

示例代码

#include <exception>
#include <memory>
#include <mutex>
#include <stack>
#include <iostream>
#include <vector>
class Test
{public:Test(int a):b(a){std::cout<<"Test "<<b<<std::endl;};Test(Test&& t){this->b = t.b; t.b = 0; std::cout<<"Test&& "<<b<<std::endl;}~Test(){std::cout<<"~Test "<<b<<std::endl;};int b;
};
int main()
{std::vector<int> v{1,2,3};v.pop_back();  // v.erase(v.end()-1);std::cout<<"vector "<<v.back()<<"and "<<*(v.data()+2)<<std::endl;// threadsafe_stack<int> ts;std::stack<Test> a;a.push(1);  //  Test 1,Test&& 1, ~Test 0a.emplace(2);  // Test 2,这里没有后面两个,根据上面的分析可得知啦Test& value = a.top();  //这里value引用了top(),虽然被pop了,但是其值还在a.pop();   // ~Test 2std::cout<<"value of pop is "<< value.b<<" and "<<a.top().b<<std::endl;  //value of pop is 2 and 1
}
vector 2and 3
Test 1
Test&& 1
~Test 0
Test 2
~Test 2
value of pop is 2 and 1
~Test 1

c++之vector以及deque的一些思考,以及pop与push的具体实现相关推荐

  1. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  2. STL vector list deque区别与实现

    1 vector 向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacitu ...

  3. C++ STL容器——序列式容器(array、vector、deque、list)

    概述 1.C++ STL的容器分为三种,序列式容器,关联式容器,无序式容器,这里先说说常用的序列式容器. 2.array,vector,deque,list,forward_list这几种都是序列式容 ...

  4. vector和deque的区别?

    vector和deque的区别? vector概述 vector的数据结构 vector的构造与内存管理 deque deque概述 deque的构造与内存管理 vector和deque的区别 vec ...

  5. 对比vector、deque、list的优缺点

    1.vector 连续存储结构,每个元素在内存上是连续的:支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下:相当于一个数组,但是与数组的区别为:内存空间的扩展.vector ...

  6. Array,Vector,List,Deque的区别与联系【转+改】

    数组 内存连续分配,长度大小固定,内置的最基础的数据结构之一.支持随机访问和随机存储. 该类型数据所占内存空间最小. Vector 是C++ STL中的一个容器.和数组类似,它拥有一段连续的内存空间, ...

  7. 关于VECTOR和DEQUE

    http://www.cnblogs.com/ixnehc/archive/2008/09/02/1282356.html  *.先说内部结构.vector就是一块连续的内存,这块连续的内存会随着成员 ...

  8. c语言实现容器,C语言三种容器:list vector和deque的区别

    在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担.还有一个就是容器,你会发现要是自己写一个链表.队列,或者是数组的时候,既要花时间还要操心怎么 ...

  9. C++基础--STL基本容器string,vector,list,deque,map

    在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来判断某一个元 ...

最新文章

  1. R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facet、facet_grid)
  2. 七位世界级Java大师的杰作
  3. 微软.net一些类的源码
  4. 集成学习(ensemble learning)(四)
  5. 实力封装:Unity打包AssetBundle(二)
  6. mysql判断表存在的sql语句_SQL 语句判断已知表是否存在_MySQL
  7. 29 上传下载 socketserve
  8. 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置
  9. Arch Linux下 让MPlayer用上CoreAVC1.7.0.0解码器
  10. Google Play 应用迁移
  11. 系统辨识与自适应控制matlab程序_杂志精选 | 自适应声反馈抑制技术及其应用
  12. 制造企业生产排产现状和APS系统的解决方案
  13. 图解python中的time、datetime模块及他们的时间格式转换(附:格林尼治时间gmt、本地时间、协调世界时utc)
  14. XiaoWei的战斗力
  15. 2的24次方等于多少MB?(附计算过程)
  16. 狄利克雷分布主题模型LDA
  17. 小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)
  18. 将MindManager添加到鼠标右键新建项
  19. 教你轻松调DCT和ICC之间Timing与Congestion的一致性
  20. appinventor拓展开发

热门文章

  1. 微信小程序体验(1):携程酒店机票火车票
  2. 如何设置设备ip,以及设置局域网
  3. IMX6ULL 修改内核启动LOGO
  4. 男朋友是一名程序员,他都好久没有交作业了
  5. 华为2288HV5使用U盘安装ESXI6.7.0
  6. JOHNSON计数器,环形计数器,普通计数器
  7. 深度学习之目标检测综述
  8. java.io.FileNotFoundException: D:\hadoop (拒绝访问。)
  9. Shopee越南市场好做吗?
  10. 2021华东师范大学计算机专硕考研经验贴