vector扩容机制

在学习了vector的时候,总说linux下是以二倍扩容的,VS是以1.5倍扩容的。

但是想一想为什么扩容是这样的呢,为什么不能是3倍或者其他倍数呢?  所以带着这些疑问,接着往下看。

首先,我们要知道vector的扩容机制:当向vector插入元素的时候,即当_finish == _end_of_storage,可能就会触发扩容机制。

扩容有二种方式:

  • 等长个数扩容
  • 倍数扩容

等长个数扩容

等长个数扩容,新空间都是在原来的空间基础上增加K个空间。每当触发扩容的时候,就会将旧空间的数据移动到新空间去,同时将旧空间释放掉。

倍数扩容

假设向vector中插入n个元素,每当_finish== 2 ^k(0,1,2,3....)时,就会出现扩容。下面以VS和linux来观察看。

void TestVectorExpand()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

VS下的测试结果:

linux下的测试结果:

可以看出,VS下的扩容差不多是以1.5倍来扩容的,而linux下的扩容是以2倍来扩容的。那么问题来了,为什么这样???

为什么都会选择倍数扩容

这是因为以等长个数来扩容的话,需要插入元素和移动元素操作总和是O(N),而以倍数扩容是O(1)。

而且VS和linux下都是以倍数扩容,还有一些原因是如果以等长个数扩容,那么个数应该是多少呢?如果太小的话,就可能导致频繁的扩容;如果太大的话,就可能出现一种情况,如果有100个元素,这是只需要再插入一个元素,但是需要扩容100个,这就导致了浪费了99个的空间。

为什么选择1.5倍或者2倍来扩容,而不是3倍或者其他倍数

最佳的扩容倍数

要想对空间的利用率最高,就是F(N-1) + F(N-2) >= F(N) ,时间上是F(N-1) + F(N-2) = F(N),这不就是1, 2 3 5 8....,所以最佳的扩容机制就是1.618

linux下为什么选择二倍扩容

我们都知道linux下都是通过页来管理内存的,通常是4KB,都是2的倍数。

这样做有三个好处:

  • 减少内存分配次数:以二倍的方式扩容可以减少内存分配的次数,每次扩容后,可以容纳更多的容量。
  • 提高性能:二倍的扩容机制可以更好的利用linux系统分配的机制,减少内存分配和释放的频率,提高性能。
  • 减少内存碎片:以二倍的方式扩容可以减少内存碎片,因为如果每次扩容都是增加一些小的容量,就有可能导致小的内存散布在堆上,增加了内存碎片的风险。

像linux下的伙伴系统就是以2的幂次方来分配内存和管理的一种算法,综合考虑,就理解了为什么linux下为什么要选择以二倍的扩容机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323660.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot新手入门完整教程和项目示例

文章目录 SpringBoot新手入门完整教程和项目示例1、SpringBoot简介2、Spring Boot的核心功能&#xff1f;&#xff08;优点&#xff09;3、SpringBoot与SpringMVC 的区别&#xff1f;4、构建SpringBoot项目4.1、在官网自动生成下载spring boot项目4.2、手动使用maven创建Spring…

中国社科院与新加坡社科大联合培养博士——单证还是双证?

有关博士学位&#xff0c;我想不用多说相信很多人都清楚&#xff0c;博士是我国学位等级中目前为止的最高学位&#xff0c;拥有了博士学位就相当于拥有了最高荣誉&#xff0c;但是&#xff0c;我国教育形式另开设了学历教育&#xff0c;对于学历教育的形式&#xff0c;在职博士…

软件测试|如何使用selenium处理下拉框?

简介 下拉框是网页表单中常见的元素之一&#xff0c;通常用于选择不同的选项。对于我们的自动化测试工作来说&#xff0c;操作下拉框是我们经常需要处理的元素&#xff0c;selenium作为我们最常使用的web自动化测试框架&#xff0c;也是支持我们对下拉框进行操作的。本文我们就…

SpringBoot介绍

1.什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其中“Boot”的意思就是“引导”&#xff0c;Spring Boot 并不是对 Spring 功能上的增强&#xff0c;而是提供了一种快速开发 Spring应用的方式。 1.1.Spring Boot 特点 • 嵌入的 Tomcat&#xff…

案例128:基于微信小程序的在线视频教育系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

2024年【北京市安全员-C3证】复审考试及北京市安全员-C3证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-C3证复审考试考前必练&#xff01;安全生产模拟考试一点通每个月更新北京市安全员-C3证证考试题目及答案&#xff01;多做几遍&#xff0c;其实通过北京市安全员-C3证模拟考试题很简单。 1、【多选题】《…

视频剪辑实例:探索画中画视频剪辑,创意无限可能,批量制作视频

随着社交媒体和视频平台的迅速发展&#xff0c;视频剪辑&#xff0c;作为视频创作的核心环节&#xff0c;对于呈现内容、传达情感和提升体验具有至关重要的作用。现在来看云炫AI智剪的视频剪辑实例&#xff0c;如何批量制作视频&#xff0c;提升工作效率。 画中画视频合并成功…

yolov8n 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明&#xff1a;参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 因为之前写了几篇yolov8模型部署的博文&#xff0c;存在两个问题&…

openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题

文章目录 openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题198.1 分析查询效率异常降低的问题198.1.1 问题现象198.1.2 处理办法 openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题 198.1 分…

【计算机网络】--集线器,路由器,交换机对比

&#x1f3b5;1.集线器 &#x1f308;1.1集线器概念 集线器是一种网络设备&#xff0c;广泛应用于计算机局域网环境中。它通常具有多个以太网接口&#xff0c;用于将多个计算机或其他网络设备连接在一起&#xff0c;形成一个网络拓扑结构。 &#x1f308;2.集线器的作用 集线器…

市场复盘总结 20240115

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 0% 失效 二进三&#xff1a; 进级率 中位数50% 最常用的二种方法&#xff1a; 方…

网络编程day2

TCP的基本通信 服务器端 #include <head.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.125.193" //服务器客户端int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket(AF_INET, …

一篇文章搞懂Jenkins持续集成解决的是什么问题

01 持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的…

@Controller层自定义注解拦截request请求校验

一、背景 笔者工作中遇到一个需求&#xff0c;需要开发一个注解&#xff0c;放在controller层的类或者方法上&#xff0c;用以校验请求参数中(不管是url还是body体内&#xff0c;都要检查&#xff0c;有token参数&#xff0c;且符合校验规则就放行)是否传了一个token的参数&am…

从零学Java 线程池

Java 线程池 文章目录 Java 线程池1 线程池概念1.1 现有问题1.2 线程池 2 线程池原理3 如何使用线程池3.1 获取线程池 4 创建线程的第四种方式 1 线程池概念 1.1 现有问题 线程是宝贵的内存资源、单个线程约占1MB空间&#xff0c;过多分配易造成内存溢出。频繁的创建及销毁线…

新版网易滑块

突然发现脸皮厚根本没用&#xff0c;大冬天的&#xff0c;风吹过来还是会冷。 大哥们多整件衣裳&#xff0c;好冷&#xff01;&#xff01;&#xff01;&#xff01; 网易更新了&#xff0c;这俩 dt跟f值。 dt为 这里返回的&#xff0c;忽略掉他。 data参数中的d值&#xff…

基于深度学习的时间序列算法总结

1.概述 深度学习方法是一种利用神经网络模型进行高级模式识别和自动特征提取的机器学习方法&#xff0c;近年来在时序预测领域取得了很好的成果。常用的深度学习模型包括循环神经网络&#xff08;RNN&#xff09;、长短时记忆网络&#xff08;LSTM&#xff09;、门控循环单元&a…

【C++】演讲比赛流程管理系统

1、演讲比赛程序需求 2、项目创建 参考之前的案例文章&#xff0c;去创建项目 3、创建管理类 4、菜单功能 5、退出功能 6、演讲比赛功能