当前位置: 首页 > news >正文

C++——Vector:push_back和emplace_back的区别,测试写入1GB大数据时的性能差距

什么是emplace_back

emplace_back是C++11引入的STL容器成员函数。emplace操作只执行构造而不执行拷贝构造。
如何理解上面这句话?先来看一个场景。

class test
{
public:test(){}test(int i){ std::cout << "test(int i)" << std::endl; }test(const test& _test){ std::cout << "test(const test& _test)" << std::endl; }
};int main()
{std::vector<test> arr;arr.reserve(5);arr.push_back(1);arr.emplace_back(1);return 0;
}

test类显式写出了三个构造函数,分别是无参构造、单参数构造、拷贝构造。因为C++中单参数的构造函数支持隐式类型转换,因此可以拿一个整型构造一个test对象。除非用explicit修饰构造函数,表示禁止隐式类型转换构造。

test(int i)
test(const test& _test)
test(int i)

这是上述代码的运行结果,可以看到push_back中,会用整数1构造一个test对象,再通过拷贝构造再构造一个对象,这才是插入到arr数组中的对象。
而emplace_back只有一次隐式类型转换的构造,因为emplace是直接使用参数在容器管理的内存空间中直接构造元素,因此没有拷贝的操作,在一定程度上提高了效率。

写入大数据时的性能差异

class test
{
public:test(){}test(int i){ }test(const test& _test){ }
};void test_push_back()
{clock_t start = clock();std::vector<test> arr;arr.reserve(1000000000);for(int i = 0; i < 1000000000; i++){arr.push_back(1);}std::cout <<"耗时:"<< (clock() - start) << std::endl;/*耗时:24.41秒*/
}void test_emplace_back()
{clock_t start = clock();std::vector<test> arr;arr.reserve(1000000000);for(int i = 0; i < 1000000000; i++){arr.emplace_back(1);}std::cout <<"耗时:"<< (clock() - start) << std::endl;/*耗时:15.86秒*/
}int main()
{test_push_back();test_emplace_back();return 0;
}shell脚本用于实时监控进程运行状况
while true; do ps aux | head -1 ; ps aux | grep a.out; printf "——————————————————————\n\n" ; sleep 1; done

一个栈上的test对象的大小是1个字节,因为test类没有存储对象成员,而编译器为了表明一个test对象存在,需要用1字节作为占位符。
109 个对象即1亿个,1个对象是1个字节。后台检测到有982456个字节,即大约1GB。可以看到,插入109个test对象的时候,差距大概是10秒钟。

应用场景

你可能说,这种优化有什么用,有什么类会允许隐式类型转换,还可能插入的时候不显式构造?
没错,就是string。

void test_push_back()
{clock_t start = clock();std::vector<std::string> arr;arr.reserve(1000000000);for(int i = 0; i < 100000000; i++){arr.push_back("Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! ");}std::cout <<"耗时:"<< (clock() - start) << std::endl;/*耗时:25.66秒*/
}void test_emplace_back()
{clock_t start = clock();std::vector<std::string> arr;arr.reserve(1000000000);for(int i = 0; i < 100000000; i++){arr.emplace_back("Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! Hello World !!! ");}std::cout <<"耗时:"<< (clock() - start) << std::endl;/*耗时:16.20秒*/
}
耗时:20.39秒
耗时:17.87

可是差距好像并不是很大=-=

综上所述:可能提升有限,但是能使用emplace_back还是不使用push_back了。

相关文章:

C++——Vector:push_back和emplace_back的区别,测试写入1GB大数据时的性能差距

什么是emplace_back emplace_back是C11引入的STL容器成员函数。emplace操作只执行构造而不执行拷贝构造。 如何理解上面这句话&#xff1f;先来看一个场景。 class test { public:test(){}test(int i){ std::cout << "test(int i)" << std::endl; }tes…...

C/C++/QT/Python/MATLAB获取文件行数的示例

1. C获取文件行数 #include <stdio.h>int main() {FILE *file fopen("path/to/your/file.txt", "r");if (file NULL) {printf("Failed to open the file!\n");return 0;}int lineCount 0;char ch;while ((ch fgetc(file)) ! EOF) {if…...

mysql的binlog參數詳解

mysql的binlog參數詳解 1. expire_logs_days expire_logs_days&#xff1a;這個參數用於設置binlog日誌文件的過期時間。默認情況下&#xff0c;binlog文件永不過期。如果將其設置為一個正整數值&#xff0c;則表示binlog文件在指定天數後會被自動刪除。 max_binlog_size m…...

【SpringSecurity】九、Base64与JWT

文章目录 1、base64编码2、Base64Url3、JWT的产生背景4、JWT介绍5、JWT组成5.1 Header5.2 Payload5.3 Signature 6、JWT的使用方式7、JWT的几个特点 1、base64编码 base64是一种编码方式&#xff0c;不是加密方式。 所谓Base64&#xff0c;就是说选出64个字符&#xff1a;小写…...

Python的io模块

io 模块提供了 Python 用于处理各种 I/O 类型的主要工具。三种主要的 I/O类型分别为: 文本 I/O, 二进制 I/O 和 原始 I/O。 io.open() 是内置的 open() 函数的别名. 语法&#xff1a; open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdTrue,openerN…...

CSS---flex布局

主要记录flex布局的要点以及实例 flex flex父标签的6个属性flex-direction: flex布局的方向flex-wrap: 是否可以换行flex-flow: flex-direction 和 flex-wrap 一起写justify-content&#xff1a;横向对齐方式align-items: 纵向对齐方式align-content: 有换行情况下的纵向对齐方…...

java线程和go协程

一、线程的实现 线程的实现方式主要有三种&#xff1a;内核线程实现、用户线程实现、用户线程加轻量级进程混合实现。因为自己只对java的线程比较熟悉一点&#xff0c;所以主要针对java线程和go的协程之间进行一个对比。 线程模型主要有三种&#xff1a;1、内核级别线程&#…...

JAVA 时间戳

时间戳&#xff08;Timestamp&#xff09;是一个表示特定时间点的数值&#xff0c;通常指的是自某个固定的起始时间&#xff08;如1970年1月1日00:00:00 UTC&#xff09;以来经过的秒数或毫秒数。 在 Java 中&#xff0c;可以使用 System.currentTimeMillis() 方法获取当前的时…...

层次分析法(matlab实现)

1.层次分析法&#xff08;AHP&#xff09; 在决策理论中&#xff0c;层次分析法是一种以数学和心理学为基础&#xff0c;组织和分析复杂决策的结构化技术&#xff0c;它代表了一种量化决策标准权重的准确方法&#xff0c;通过成对比较&#xff0c;利用个别专家的经验来估计因素…...

python selenium 自动化登录页面

去掉自动化标识&#xff0c;绕过js&#xff0c;绕过ip import time from selenium import webdriver from selenium.webdriver.chrome.options import Options# 去掉自动化标识&#xff0c;绕过js option Options() option.add_experimental_option(excludeSwitches, [enable…...

【Linux】高级IO --- 多路转接,select,poll,epoll

所有通过捷径所获取的快乐&#xff0c;无论是金钱、性还是名望&#xff0c;最终都会给自己带来痛苦 文章目录 一、五种IO模型1.什么是高效的IO&#xff1f;&#xff08;降低等待的时间比重&#xff09;2.有哪些IO模型&#xff1f;哪些模型是高效的&#xff1f;3.五种IO模型的特…...

anaconda navigator打不开,一直在loading画面

anaconda navigator打不开&#xff0c;一直在loading画面。百度解决方法&#xff0c;用网上的方法在命令窗口里运行conda update anaconda结果一直显示 solving environment卡在那里。又尝试用管理员身份运行还是不行&#xff0c;打开后出现There in aninstance of Anaconda Na…...

【Java基础】深入理解反射、反射的应用(工厂模式、代理模式)

文章目录 1. Java反射机制是什么&#xff1f;1.2 Java反射例子 2. Java反射机制中获取Class的三种方式及区别&#xff1f;3. Java反射机制的应用场景有哪些&#xff1f;3.1. 优化静态工厂模式&#xff08;解耦&#xff09;3.1.1 优化前&#xff08;工厂类和产品类耦合&#xff…...

VUE 项目 nginx部署

server {listen 80; # 监听的端口号server_name 129.204.189.149; # 服务器的ip或者域名#charset koi8-r;#access_log logs/host.access.log main;# 前端服务反向代理配置location / {proxy_http_version 1.1;proxy_set_header Host $host;proxy_set_header X-Real-…...

Hashtable和HashMap、ConcurrentHashMap 之间的区别

Hashtable和HashMap的区别 HashMap和Hashtable都是哈希表数据结构&#xff0c;但是Hashtable是线程安全的&#xff0c;HashMap是线程不安全的 Hashtable实现线程安全就是简单的把关键方法都加上了synchronized关键字 直接在方法上添加synchronized相当于针对this对象&#xff0…...

包管理工具--》npm的配置及使用(二)

在阅读本篇文章前请先阅读包管理工具--》npm的配置及使用&#xff08;一&#xff09; 目录 &#x1f31f;语义版本 避免还原的差异 npm的差异版本处理 &#x1f31f;npm 脚本 &#xff08;npm scripts&#xff09; &#x1f31f;运行环境配置 在node中读取package.json …...

【Linux】多线程2——线程互斥与同步/多线程应用

文章目录 1. 线程互斥1.1 问题引入1.2 线程互斥的相关概念1.3 互斥量mutex1.4 互斥量实现原理1.5 死锁 2. 线程安全和可重入函数3. 线程同步3.1 同步概念3.2 条件变量 4. 生产消费模型4.1 基于阻塞队列的cp模型4.2 基于环形队列的cp模型POSIX信号量 5. 线程池5.1 互斥量RAII版本…...

Python中的函数式编程是什么?

Python中的函数式编程是一种编程范式&#xff0c;它强调使用纯函数和避免可变状态来构建程序。函数式编程的核心思想是将计算视为函数的求值&#xff0c;而不是通过改变状态来实现。在函数式编程中&#xff0c;函数被视为一等公民&#xff0c;可以作为参数传递给其他函数&#…...

8月《中国数据库行业分析报告》已发布,聚焦数据仓库、首发【全球数据仓库产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…...

TikTok Shop|如何成为定邀卖家?

TikTok在商品售卖资质和商家资质上做了很多限制&#xff0c;比如我们熟知的珠宝类目&#xff0c;今天我们结合TikTok Shop规则中心8月30号发布的《如何申请成为“定邀”卖家》和关于“定邀”商品的政策进行分析&#xff0c;看看如何成为“定邀”卖家。 定邀商品/类目有哪些&am…...

STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功

STM32F103红外小车避坑指南&#xff1a;从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时&#xff0c;我花了整整三天时间在Proteus里调试仿真&#xff0c;结果连最基本的电机转动都实现不了。直到把电路搬到实物上&#xff0c;才发现仿真环境里那些看似…...

Java泛型中的List

本文将详细回答java泛型中的listt extends base>使用问题。 在java中&#xff0c;泛型提供了强大的类型安全机制&#xff0c;但其一些特点也容易引起混淆&#xff0c;如listt extends base>开发者经常感到困难。假设sub是base的子类&#xff1a;public class base { }pub…...

Amlogic S9XXX设备系统改造完全指南:从入门到进阶

Amlogic S9XXX设备系统改造完全指南&#xff1a;从入门到进阶 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk35…...

软文SEO的常见指标有哪些_如何撰写有吸引力的软文标题

<h2>软文SEO的常见指标有哪些</h2> <p>在当今的数字营销领域&#xff0c;软文&#xff08;Soft Article&#xff09;已经成为推动网站流量和品牌知名度的重要工具。要让软文真正发挥作用&#xff0c;我们必须了解软文SEO的常见指标&#xff0c;这些指标可以帮…...

Lingbot-Depth-Pretrain-ViTL-14 Anaconda环境搭建:创建隔离的Python开发与推理环境

Lingbot-Depth-Pretrain-ViTL-14 Anaconda环境搭建&#xff1a;创建隔离的Python开发与推理环境 你是不是也遇到过这种情况&#xff1a;好不容易跟着教程跑通了一个AI项目&#xff0c;结果过两天想跑另一个项目时&#xff0c;发现各种库版本冲突&#xff0c;报错满天飞&#x…...

保姆级教程:用PtitPrince的RainCloud函数,5步搞定分组数据可视化

5步精通RainCloud Plot&#xff1a;用PtitPrince实现专业级分组数据可视化 第一次看到同事用雨云图展示A/B测试结果时&#xff0c;我被这种"既见森林又见树木"的呈现方式震撼了——左侧的密度曲线如山脉般起伏&#xff0c;中间的箱线图标出关键分位点&#xff0c;右侧…...

圆形光斑激光熔覆 Comsol 仿真:科研利器已就位

圆形光斑激光熔覆comsol仿真模型&#xff0c;模型已通过实验验证了正确性&#xff0c;确保模型一定正确可用于科研。 高斯热源&#xff0c;马兰戈尼效应&#xff0c;粘性耗散力等&#xff0c;激光熔覆过程必要项均考虑在模型中。 可根据自己需要调整工艺参数&#xff0c;做完对…...

YOLOv12模型轻量化实战:应对嵌入式设备资源约束

YOLOv12模型轻量化实战&#xff1a;应对嵌入式设备资源约束 最近几年&#xff0c;目标检测模型在精度上突飞猛进&#xff0c;但随之而来的是模型体积和计算量的急剧膨胀。当你兴冲冲地想把最新的YOLOv12模型部署到Jetson Nano或者树莓派上时&#xff0c;往往会发现现实很骨感&…...

Qwen3-ASR-0.6B效果展示:金融客服录音(专业术语+缩略语)识别术语表匹配

Qwen3-ASR-0.6B效果展示&#xff1a;金融客服录音&#xff08;专业术语缩略语&#xff09;识别术语表匹配 金融客服电话录音里&#xff0c;客户和坐席的对话常常像在说“天书”。一会儿是“LPR”&#xff0c;一会儿是“T0”&#xff0c;还有各种产品代码和内部术语。把这些录音…...

别再死记硬背了!用Python可视化理解L-smooth函数与梯度Lipschitz连续

别再死记硬背了&#xff01;用Python可视化理解L-smooth函数与梯度Lipschitz连续 第一次接触L-smooth这个概念时&#xff0c;我盯着数学公式看了整整一个下午——梯度Lipschitz连续、二次上界、等价性证明&#xff0c;每个词都认识&#xff0c;连起来却像天书。直到我用Python画…...