C++STL库中vector的内存分配方式

在C++ STL(Standard Template Library)中,std::vector是一个动态数组,它可以根据需要增长或缩小。关于std::vector的内存分配方式,以下是关键点的概述:

1.初始分配

当创建一个std::vector对象时,它通常不会立即分配任何内存空间(除了可能为了存储一些内部元数据)。但是,当你向vector中插入第一个元素时,它会分配一块内存来存储该元素。这块内存的大小通常大于你所需的最小空间,以便为未来的增长预留一些空间。

2.增长策略

vector的当前容量不足以容纳更多的元素时,它会分配一块更大的内存块,并将现有元素复制到新的内存位置。这个新的内存块通常比旧的大得多,以便为未来的增长提供空间。这种策略称为“预留策略”或“容量预留”,旨在减少因频繁重新分配和复制元素而导致的性能开销。

3.内存连续

std::vector保证存储在其中的元素在内存中是连续的。这意味着你可以像操作普通数组一样安全地获取指向vector中元素的指针或迭代器,并进行诸如指针算术之类的操作。

4.容量与大小

vector有两个重要的属性:size()capacity()size()返回vector中当前存储的元素数量,而capacity()返回vector当前分配的内存空间可以容纳的元素数量。capacity()通常大于或等于size(),并且在每次重新分配内存时都会增加。

5.手动管理容量

你可以使用reserve()函数来手动请求vector预留特定数量的容量。这在你知道将要插入大量元素并且希望减少重新分配的次数时非常有用。同样,你可以使用shrink_to_fit()函数来请求vector减少其容量以匹配其当前大小(尽管这不一定总是有效,因为编译器可以选择忽略此请求)。

6.内存释放

vector对象被销毁时(例如,当它离开其作用域或被删除时),它会释放其分配的所有内存。你不需要(也不应该)手动释放vector使用的内存。

需要注意的是,虽然std::vector的内存分配方式在大多数情况下都能提供良好的性能,但在某些特定场景下(例如,当你需要频繁地添加或删除大量元素时),其他数据结构(如std::liststd::deque)可能更适合。

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

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

相关文章

GPT状态和原理 - 解密OpenAI模型训练

目录 1 如何训练 GPT 助手 1.1 第一阶段 Pretraining 预训练 1.2 第二阶段:Supervised Finetuning有监督微调 1.3 第三阶段 Reward Modeling 奖励建模 1.4 第四阶段 Reinforcement Learning 强化学习 1.5 总结 2 第二部分:如何有效的应用在您的应…

【Linux】Linux信号

目录 信号的概念 生活中的信号 Linux中的信号 kill命令 kill 命令的使用 常见的信号 命令行代码示例 注意事项 信号的处理方式 产生信号 信号的捕捉 信号捕捉示意图 内核如何实现信号捕捉 信号的捕捉与处理 小结 阻塞信号 信号在内核中的表示图 信号集操作函数…

如何学习嵌入式Linux?

如何去学习嵌入式 Linux 呢?嵌入式底层开发毫无疑问是一项极为关键重要的技术,其被广泛地应用于形形色色的嵌入式系统之中。伴随科技的迅猛飞速发展,嵌入式系统已然成为了我们生活中不可或缺的一个组成部分,这也极为凸显出了嵌入式…

基于 Bazel 的 iOS Monorepo 工程实践

在之前很长一段时间里,哔哩哔哩 iOS 工程是使用 Polyrepo(或者说 Multirepo,即多仓库)的传统模式进行开发。但是随着业务的发展,我们的代码仓库的数量也随之膨胀,我们慢慢发现 Polyrepo 模式并不一定是适合…

DDoS攻击愈演愈烈,谈如何做好DDoS防御

DDoS攻击是目前最常见的网络攻击方式之一,各种规模的企业包括组织机构都在受其影响。对于未受保护的企业来讲,每次DDoS攻击的平均成本为20万美元。可见,我们显然需要开展更多的DDoS防御工作。除考虑如何规避已发生的攻击外,更重要…

手机副业赚钱秘籍:让你的手机变成赚钱利器

当今社会,智能手机已然成为我们生活不可或缺的一部分。随着技术的飞速进步,手机不再仅仅是通讯工具,而是化身为生活伴侣与工作助手。在这个信息爆炸的时代,我们时常会被一种焦虑感所困扰:如何能让手机超越消磨时光的定…

关于Git的一些基础用法

关于Git的一些基础用法 1. 前言2. 使用GitHub/gitee创建项目2.1 创建账号2.2 创建项目2.3 下载仓库到本地2.4 提交代码到远端仓库2.5 查看日志2.6 同步远端仓库和本地仓库 1. 前言 首先说一个冷知识(好像也不是很冷),Linux和git的创始人是同…

CC254X 8051芯片手册介绍

1 8051CPU 8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,如Atmel、飞利浦、深联华等公…

C++:类型转换

目录 1、C语言中的类型转换 2、C的四种类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3 RTTI 1、C语言中的类型转换 如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值…

TexStudio + MikTex 手动安装宏包

遇到上面这个 “宏包安装” 提示窗口后,设置来源为本地,随后在这个网址 https://mirrors.ustc.edu.cn/CTAN/systems/win32/miktex/tm/packages/ 下载所需的宏包,放到本地仓库里,即可 有三个宏包是必须要有的,它们是索…

上下文输入无限制,谷歌发布Infini-Transformer

去年,百川智能发布号称全球最长的上下文窗口大模型Baichuan2-192K,一次性可输入35万字,超越GPT-4。 今年3月,Kimi智能助手宣布在上下文窗口技术上突破200万字。 紧追其后,国内各大互联网巨头纷纷布局升级自家大模型产…

JAVA基础08- 继承,重写,super以及this

目录 继承(extends) 定义 说明 作用 方法的重写 定义 重写关键点 方法重写与重载的区别 练习 练习1(方法继承与重写的简单练习) 练习2(方法继承与重写的进阶练习) This的使用 定义 作用以及注…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息?二、查看Postman的版本信息的步骤 一、为何需要查看版本信息? 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂,牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

基于SpringBoot+Vue的二手车交易系统的设计与实现(源码+文档+包运行)

一.系统概述 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大,容错率低&…

Connection: keep-alive 简介

一、在使用fiddler抓包工具会出现如下场景 二、keep-alive 保持连接 "Connection: keep-alive" 是 HTTP 协议中的一个头部字段,用于指示客户端和服务器之间的连接是否保持活跃状态。 当客户端发送一个 HTTP 请求给服务器时,可以在请求头部中包…

阿里云4核8G云服务器价格多少钱?700元1年

阿里云4核8G云服务器价格多少钱?700元1年。阿里云4核8G服务器租用优惠价格700元1年,配置为ECS通用算力型u1实例(ecs.u1-c1m2.xlarge)4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选,CPU采用Intel(R) Xeon(R…

储能系统--BMS电流采样详解

一、行业标准介绍 汽车电池管理系统 储能电池管理系统 二、BMS电流采样 (1)电流采样的作用 电流传感器一般会位于动力电池系统主正或主副回路测量整个电池包的电流,电流信号会送到BMS,给BMS做充放电控制,电池SOC、SO…

pip安装swig@FreeBSD

SWIG (Simplified Wrapper and Interface Generator) 是一个用于连接 C/C 代码与其他高级编程语言(如Python、Java、C# 等)的工具。它允许开发人员将现有的 C/C 代码封装成可以在其他语言中调用的接口,而无需手动编写大量的代码。 SWIG 的工…

编程入门(三)【GPT工具的使用】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言背景了解GPT工具使用技巧GPT工具在学习和工作中的应用 前言 背景了解 2…
最新文章