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

c++26新功能—inplace_vector

一、inplace_vector

inplace_vector,看上去有些古怪,在前面的标准库中,已经有了std::array和std::vector,为什么在标准库中又设计一个inplace_vector?只有一个原因,实际的应用场景有需要。比如在嵌入式系统中,开发者可能需要vector的一些灵活的操作但又不愿意二次动态扩展,使用数组又有可能无法控制数组动态的大小(比如在范围内的动态增减,需要手动进行标记和识别,移动等)。
或者可以这样理解,可能需要一个数据处理量不大(不需要动态分配内存),但应用又可以自动管理自身数据内容的容器即类似于std::vector与std::array二者之间的一种容器。这样既有了数组的效率又有了向量的灵活。当然,这种容器应用的场景也被限定了,只能是小数据量情况下,一般会在K级内。
所以在C++26中就推出了这个std::inplace_vector,用来实现上述的这种应用场景,需要说明的是,它分配的栈空间上,容量固定,大小可变,在处理小数据量时优势更明显。

二、与std::array和std::vector的比较

既然分析了std::inplace_vector,那么std::inplace_vector与std::array和std::vector的具体的区别有哪些呢?
1、std::vector分配在堆空间上,而其它两个分配在栈空间上
2、std::vector在运行时大小容量可变化(二次分配),但在其它两个容器在编译时则已经固定容量
3、std::array的大小是不可变的,即大小和容量保持一致;而其它两个大小可变(即容量和大小分离),不过std::inplace_vector大小只能固定的容量范围内变化
4、std::vector可能在运行时再次进行容量的扩展,其它两个容器则永远不会
5、std::array没有异常处理,而其它两个都存在异常处理的情况

三、应用场景

std::inplace_vector的特点就是其应用的场景的特点,或者说是应用的需求特点确定了std::inplace_vector的特点。从此处可以看出std::inplace_vector的应用场景:
1、嵌入式和低功耗的设备
一般无法或很少动态分配内存,主要是为了提高处理效率,提高访问速度
2、对延时控制要求很高的场景
比如实时系统或高频交易,毕竟std::inplace_vector在栈上操作也不进行二次扩展
3、需要在某些需要动态调整大小的场景下
比如在常量求值期骨需要动态处理数组的大小的情况

四、例程

看一下官网相关的例程:

#include <algorithm>
#include <array>
#include <cassert>
#include <inplace_vector>int main()
{std::inplace_vector<int, 4> v1{0, 1, 2};assert(v1.max_size() == 4);assert(v1.capacity() == 4);assert(v1.size() == 3);assert(std::ranges::equal(v1, std::array{0, 1, 2}));assert(v1[0] == 0);assert(v1.at(0) == 0);assert(v1.front() == 0);assert(*v1.begin() == 0);assert(v1.back() == 2);v1.push_back(3);assert(v1.back() == 3);assert(std::ranges::equal(v1, std::array{0, 1, 2, 3}));v1.resize(3);assert(std::ranges::equal(v1, std::array{0, 1, 2}));assert(v1.try_push_back(3) != nullptr);assert(v1.back() == 3);assert(v1.size() == 4);assert(v1.try_push_back(13) == nullptr); // no placeassert(v1.back() == 3);assert(v1.size() == 4);v1.clear();assert(v1.size() == 0);assert(v1.empty());
}

这个代码还是非常简单的,就不做具体分析了。有兴趣的可以详细的用相关工具进行对比分析,就能更好的理解此容器的应用。

五、总结

越看标准的演进,越可以发现,标准真的是一边向其它高级语言对齐一些优秀的应用特点;另外一边还要不停的把缺失的应用场景不断的补齐。std::inplace_vector就是典型的一种情况,其实这种场景下,直接用数组操作然后再做一些处理也可以达到类似的效果。可如果标准库中有的话,大家肯定更乐意使用标准库的容器。
一面不断创新,一面不断完善,这就是标准的强大之处。

http://www.dtcms.com/a/329451.html

相关文章:

  • 达梦数据库常见漏洞及处理方案
  • PostgreSQL——索引
  • TensorFlow实现回归分析详解
  • npm install 的作用
  • HTTP 请求转发与重定向详解及其应用(含 Java 示例)
  • Windows平台RTSP播放器选型与低延迟全解析及技术实践
  • 迅为RK3568开发板模型推理测试实战deeplabv3语义分割
  • Java基础 8.13
  • 【Flowable】工作流网关 控制流程的流向
  • 深度学习——03 神经网络(3)-网络优化方法
  • 门店销售机器人的智能升级:具身智能模型带来的变革
  • Mac安装ant
  • Linux性能分析教程:top, htop, iotop命令使用详解 (服务器慢/卡顿排查)
  • 电脑如何安装win10专业版_电脑用u盘安装win10专业版教程
  • GO学习记录四——读取excel完成数据库建表
  • 10.反射获取静态类的属性 C#例子 WPF例子
  • 5.0.9.1 C# wpf通过WindowsFormsHost嵌入windows media player(AxInterop.WMPLib)
  • BGE向量算法
  • C++冒泡、选择、快速、桶排序超超超详细解析
  • 20. 有效的括号 - 力扣(LeetCode)
  • P1886 滑动窗口 /【模板】单调队列【题解】
  • 《Foundations and Recent Trends in Multimodal Mobile Agents: A Survey》论文精读笔记
  • [量化交易](1获取加密货币的交易数据)
  • 面试实战 问题三十 HTTP协议中TCP三次握手与四次挥手详解
  • 解决程序连不上RabbitMQ:Attempting to connect to/access to vhost虚拟主机挂了的排错与恢复
  • 循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
  • DataOceanAI Dolphin(ffmpeg音频转化教程) 多语言(中国方言)语音识别系统部署与应用指南
  • Vue 3 源码解读与核心 API 分析
  • EN 62368消费电子、信息技术设备和办公设备安全要求标准
  • mybtias集成spring原理?--spring,mybatis源码解析