[原创](Modern C++)现代C++的关键性概念: std::span, 低内存开销的方式来操作大数据.

ops/2025/2/25 11:44:14/

<span style="color:#fe2c24">[作者]span>
常用网名: <span style="color:#fe2c24">猪头三span>
出生日期: 1981.XX.XX
企鹅交流: <span style="color:#fe2c24">643439947span>
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

<span style="color:#fe2c24">[序言]span>
在现代C++编程中, 特别是在处理大数据集时, 如何高效地管理内存是一个不可忽视的问题. 假设需要处理一个包含上千万个浮点数的数据列, 传统的做法可能是通过new关键字动态分配一块内存来存储这些数据. 然而, 当希望利用现代C++的特性——如STL容器或算法——对这些数据进行后续操作时, 通常需要将数据转移到新的容器中, 比如std::vector. 这个过程往往伴随着额外的内存分配和数据拷贝, 不仅增加了内存开销, 还可能显著降低程序的性能, 尤其是在数据量巨大的情况下. 幸运的是, C++20引入了一个轻量级的工具——std::span, 提供了一种低内存开销的解决方案. std::span本质上是一个非拥有的视图, 它可以引用一块连续的内存(例如数组或动态分配的内存), 而无需复制数据或管理内存的生命周期. 它的出现使得开发者能够以现代C++的方式操作大数据集, 同时保持高效的内存使用. 无论是直接访问数据、循环遍历, 还是结合STL算法进行处理, std::span都能在不引入额外内存开销的前提下, 满足这些需求. 这种特性使其成为大数据分析和高效编程中的重要工具. 

<span style="color:#fe2c24">[代码演示]span>

int main()
{// 用 new 分配内存,并用 unique_ptr 管理,50 个 float// 注意:为了演示方便,这里仅使用50个float,实际应用中可能是上千万个std::unique_ptr<float[]> ptr_Data(new float[50]);// 创建 std::span 来管理这块内存std::span<float> span_Manage(ptr_Data.get(), 50);// 现在可以以更加现代的方式修改、循环、提取数据span_Manage[0] = 0.8f;// 示例:遍历并打印前5个元素std::cout << "前5个元素: ";for (size_t i = 0; i < 5 && i < span_Manage.size(); ++i) {std::cout << span_Manage[i] << " ";}std::cout << std::endl;return 0;}

<span style="color:#fe2c24">[代码作用]span>
<span style="color:#fe2c24">内存分配:span> 代码中使用new动态分配了一块包含50个float的内存, 并通过std::unique_ptr管理这块内存, 确保资源在作用域结束时自动释放.  

<span style="color:#fe2c24">创建std::span:span> 通过std::span<float> span_Manage(ptr_Data.get(), 50), 创建了一个std::span对象, 它引用了ptr_Data指向的内存块. std::span不拥有这块内存, 仅作为一个视图存在.  

<span style="color:#fe2c24">操作数据: span>可以像操作数组一样直接访问和修改span_Manage中的元素(例如span_Manage[0] = 0.8f), 也可以通过循环遍历数据.这种灵活性得益于std::span提供的现代化接口.

<span style="color:#fe2c24">[总结]span>
std::span是C++20提供的一种轻量级、非拥有的内存视图. 通过std::span可以直接操作动态分配的内存块无需将其复制到其他容器中而显著降低了内存开销并提升了性能. 无论是对大数据集进行简单访问是结合STL算法执行复杂操作td::span都展现了其灵活性和高效性. 它的设计理念体现了现代C++对高效内存管理和现代化编程的支持.


http://www.ppmy.cn/ops/161189.html

相关文章

Hive SQL中,使用WITH子句和创建临时表性能对比

在Hive SQL中&#xff0c;使用WITH子句&#xff08;CTE&#xff09;通常比显式创建临时表运行更快&#xff0c;但具体性能差异取决于场景和数据规模。以下是关键分析&#xff1a; 1. WITH子句&#xff08;CTE&#xff09;的优势 无物理存储&#xff1a; CTE是逻辑临时结果集&am…

C#中开发OCR应用时,以下是一些推荐的开源库和工具

在C#中开发OCR应用时&#xff0c;以下是一些推荐的开源库和工具&#xff0c;以及它们的简要使用指南&#xff1a; 1. Tesseract OCR (最主流推荐) 简介: Google 开源的OCR引擎&#xff0c;支持多语言&#xff0c;历史悠久且社区活跃。NuGet包: Tesseract (纯C#封装) 优点: 完全…

登录-12.Interceptor-详解

一.拦截器-拦截路径 配置拦截除了"/login"登录请求以外的所有请求。下面我们进行演示。首先演示登录。 当前返回值中没有输出任何定义拦截器时preHandle&#xff0c;postHandle和afterCompletion的输出信息&#xff0c;因此可以知道拦截器Interceptor并没有生效&…

MySQL 数据库基础

1. MySQL 数据库基础 在这一部分&#xff0c;我们将学习 MySQL 的基本概念和常见的数据库操作&#xff0c;帮助你掌握如何创建数据库、表&#xff0c;并进行数据的增、删、改操作。同时&#xff0c;我们还会探讨一些常见的错误示例及其原因&#xff0c;帮助你避免常见的陷阱。…

Visual Studio C++中MT、MTd、MD、MDd都是什么

在 Visual Studio 的 C/C 运行时库配置中&#xff0c;MT、MTd、MD、MDd 是控制程序如何链接 C/C 标准库和运行时库的关键选项。它们的区别如下&#xff1a; 1. 基本分类 选项含义MT多线程静态链接 Release 版运行时库 (Multithreaded, Static Link)MTd多线程静态链接 Debug 版…

Node.js 中 child_process 模块教程

Node.js 中 child_process 模块教程 简介 Node.js 的 child_process 模块提供了在 Node.js 应用程序中创建和管理子进程的能力。这个功能对于执行系统命令、运行外部程序、以及充分利用多核 CPU 资源都非常有用。 主要方法 1. spawn() spawn() 方法用于启动一个新进程来执…

【MySQL】表的增删查改(CRUD)(上)

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 CRUD&#xff1a;Create&#xff08;新增数据&#xff09;、Retrieve&#xff08;查询数据&#xff09;、Update&#xff08;修改数据&#xff09;、Delete&#xff08;修改数据…

PyTorch gather 方法详解:作用、应用场景与示例解析(中英双语)

PyTorch gather 方法详解&#xff1a;作用、应用场景与示例解析 在深度学习和自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;我们经常需要从高维张量中提取特定索引的数据。 PyTorch 提供的 torch.gather 方法可以高效地从张量的指定维度收集数据&#xff0c;广泛…