C++20 std::span

std::span std::span是一个非常有用的类型,它使得在 C++ 中处理连续内存块的操作变得更加简洁和高效。使用std::span可以减少内存拷贝,同时提高代码的可读性和灵活性,特别是在处理数组或容器时。如果你正在编写需要高效处理大规模数据的代码,std::span是一个非常合适的选择。 阅读详情
AI摘要

本文探讨了span作为连续对象存储观察者的作用,对比了std::string_view与string的关系,介绍了如何利用span简化对连续内存区域的处理,包括数组和非数组的连续内存,并通过实例展示了span在内存初始化函数中的应用。

span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。
连续的存储,不一定是数组。例如:

zero(char (&arr) [10]);  //10个元素的数组, sizeof(arr)==10*sizeof(char)==10
zero(char arr[]);  //arr退化为指针, sizeof(arr)==sizeof(char*)
zero(char *arr, size_t n);  //处理任意含n个char的连续内存

void main(){
    char* pc = new char[10];
    zero(pc,10);  //连续内存,但不是数组
}

为了程序的复用性,我们一般使用zero(char* arr, size_t n);这种函数签名。
 

template<size_t N>
void zero(char (&arr)[N]) ;

这种模板形式虽然比只能处理char[10]这种类型的zero函数,适用性大一些,但是它仍不能处理广义上的连续char内存。
zero(char*arr, sizr_t n)的灵活性是有了,问题是用户(调用者)可能把n填错。例如:

char aa[10];
zero(aa,20);

为了解决这个问题,我们需要写很繁琐的代码:

char aa[10];
std::array<char,10> bb;

zero(aa,sizeof(aa)/sizeof(aa[0]));
zero(bb.data(),bb.size());

有了std::span, 我们可以:

void zero( std::span<char> sp ){
    size_t n = sp.size();
    sp[n-1]=0; //当数组越界时,仍可能引发事故。
}

char aa[10];
std::array<char,10> bb;
  
zero(aa);
zero(bb);  //简化,统一

我们可以手工粗陋的制作一个span类,虽然它不符合STL容器规范,但是可以看出主要核心骨架

// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <cstdlib>
#include <array>

template<class T>
class span{
public:
    template<size_t N>
    span(T (&arr)[N]){
        arr_ = arr;
        n_ = N;
    }
    
    template<size_t N>
    span(std::array<T,N>& arr){
        arr_ = arr.data();
        n_ = N;
    }
    
    span(T* arr,size_t n){
        arr_ = arr;
        n_ = n;
    }
    
    T* data(){ return arr_;}
    size_t size(){ return n_;}
    
private:
    T* arr_;
    size_t n_;
};

void zero( span<char> sp ){
    
    char* arr = sp.data();
    size_t n = sp.size();
    arr[n-1]=0;
}

int main()
{
    char aa[10];
    std::array<char,10> bb;
    
    size_t n=10;
    char* pc = new char[n];

      
    zero(aa);
    zero(bb);
    zero({pc,n});
   
}

 

新手必看:C++20的std::span用法详解,告别数组长度传递烦恼 本文详细解析了C++20引入的std::span,这一现代C++利器旨在解决传统数组处理中必须显式传递长度的痛点。std::span作为一个轻量级的非拥有视图,能安全、统一地封装C风格数组、std::vector等连续内存序列,从而简化函数接口、提升代码安全性与表达力。文章通过丰富的实战示例,指导新手掌握其核心用法与最佳实践。 阅读详情

相关推荐

C++20 std::span与原生指针转换:跨平台兼容性实战指南

在C++编程中,内存安全与高效访问是核心议题。传统上,开发者常使用原生指针与长度参数对来操作连续内存,但这存在类型不安全、接口冗长等固有缺陷。C++20引入的std::span作为一种轻量级、非拥有型的序列视图,其设计原理旨在提供类型安全的连续内存引用,从而提升代码的健壮性与表达力。它的技术价值在于以零开销抽象封装了指针与大小,提供了完整的容器接口与边界检查能力,是现代C++替代C风格数组的理想工具。在实际应用场景中,尤其是在涉及跨平台开发、与遗留C接口交互或进行底层内存操作时,如何在不同编译器(如GCC、

weixin_33416697的博客 238

C++20之std::span:高效访问容器的神器

C++20引入了std::span作为一种语法糖,用于表示连续内存范围。它提供了一种轻量级的、非拥有式的、零开销的方式来引用数组或其他连续内存块。std::span可以用于传递数组片段给函数,或者在函数内部对连续内存进行操作,而无需进行内存拷贝。 std::span提供连续对象序列的轻量级视图。 span 提供了一种安全的方法来对在内存中背靠背排列的对象进行迭代和索引。 例如存储在内置数组中的对象 std::array 或 std::vector。如果你通常使用指针和索引访问一系列背靠背对

红军不怕远征难,万水千山只等闲 4538

26、C++17/20 通用实用工具:std::optional、std::variant 和 std::span 的使用

本文详细介绍了 C++17 和 C++20 中引入的三个实用工具:std::optional、std::variant 和 std::span。std::optional 用于处理可选参数,避免不必要的对象复制并提高性能;std::variant 是类型安全的联合,用于存储多个替代类型之一,支持灵活的值访问和操作;std::span 用于表示连续对象序列的视图,提升对数组和容器的操作效率。通过示例代码和详细解析,展示了这些工具在现代 C++ 编程中的实际应用和优势。

lll78的博客 235

stdspan ---C++20

的定义 是指向一组连续的对象的对象, 是一个视图, 不是一个拥有者一组连续的对象可以是 C 数组, 带着大小的指针, , 或者可以有两种范围:**静态范围: **编译期就可以确定大小**动态范围: ** 由指向第一个对象的指针和连续对象的大小组成 构造 默认构造 使用迭代器() 迭代器 + 大小 C-stye数组 在构造时不支持隐式类型转换 可以推断C-stye数组的大小 修改 可以修改的指向,或者修改子集 std::span - cppreference.comstd::basic_

qq_42896106的博客 2115

基于RK3588与Gstreamer的端侧实时视频流AI推理系统构建

本文详细介绍了基于RK3588芯片与Gstreamer框架构建端侧实时视频流AI推理系统的完整方案。通过硬件选型、环境配置、OpenCV编译优化、视频流处理实战及模型部署等关键环节的深入解析,展示了如何利用RK3588的6TOPS NPU算力与Gstreamer的低延迟特性,实现工业质检、智能交通等场景下的高效边缘计算。特别针对RTSP推拉流优化、RKNN模型转换等核心技术难点提供了实用解决方案。

weixin_30516243的博客 381

RT-Thread实战:手把手教你用STM32F04ZGT6通过SPI驱动BMI088(附完整工程)

本文详细介绍了如何使用RT-Thread操作系统在STM32F04ZGT6上通过SPI接口驱动BMI088高性能6轴惯性传感器(包含陀螺仪和加速度计)。从硬件连接到软件配置,再到数据采集与处理,提供了完整的开发指南和优化技巧,帮助开发者快速实现精确的姿态测量功能。

kappa的博客 237

(C++20) span简单实现

而入错传递的是一个视图,这个视图能够指向原对象,那么这个直接传递的开销也是我们可以接受的。关于std::vector和std::array相对比较方便,也是大家平时直接应用的方式。到了C++中泛化出了迭代器的标准。关于这里的第二个传入首位位置的版本,需要允许两者直接的相互减。可见具有动态长度的std::vector在这里是最方便的。在不传递引用的情况下,传递对象在很多时候会巨大的性能损耗。这里的主要难点就是对构造函数的实现,如何获得首地址和长度。是C语言中传数组的最常见形式。高,不然无法获得数组的引用。

cuber-lotus的博客 1275

手把手教你搞定Pattern Recognition期刊的LaTeX投稿(附完整模板下载与避坑指南)

本文详细指导如何在Pattern Recognition期刊上使用LaTeX进行投稿,包括模板下载、环境配置、核心排版规范及投稿材料准备。特别强调期刊对格式的严格要求,如数学符号、图像引用等细节,并提供实用技巧和避坑指南,帮助作者高效完成投稿流程。

weixin_30876945的博客 395

C++ 20新特性之std::span

实际上,std::span是一个非常实用的容器适配器,用于表示连续的内存区域。它并不直接拥有数据,而是提供了一种访问现有数组或容器元素的方式,增强了代码的灵活性和泛型性。std::span可以看作是对指针和长度对的一个类型安全、范围安全的封装,特别适合用于算法和接口设计中,以提高代码的可重用性和安全性。

hope_wisdom的技术博客 3891

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1140

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5095

C++20新特性_std::format和span

性能:format的性能优于iostream,在某些情况下超过 printf.语法:format结合了python风格的易用性和C++的高性能,是现代C++开发中处理字符串的首选工具。span优点:零拷贝,统一接口(连续内存都可以使用span处理),类型安全,支持切片。需要注意的是,使用span时,避免悬空引用。

weixin_43916755的博客 916

AI硬件加速:CPU vs GPU性能对比

AI硬件加速:CPU vs GPU性能对比 关键词:人工智能、硬件加速、CPU、GPU、性能对比、硬件架构、并行计算、优化策略、项目实战 摘要: 本文将深入探讨AI

AI天才研究院 1914

C++20: std::span

摘要: std::span是C++20引入的一种轻量级视图,用于安全访问连续内存序列(如数组、vector等)。它能自动推导容器大小,支持数据修改(不同于std::string_view),提供subspan等切片操作。但需注意,C++26前不包含边界检查,越界访问会导致未定义行为。示例展示了其基本用法、数据指针获取及潜在风险,建议结合size()方法自行管理边界。参考cppreference和Modernes C++相关文档获取更多细节。 (148字)

bdn_nbd的博客 567

一键开关机电路

一键开关机电路

让你爱上电路设计 4180

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 400

C++17 和 C++20 中的新容器与工具:std::optional、std::variant 和 std::span

C++17和C++20引入的三个关键工具提升了代码安全性与表达能力: std::optional 优雅处理可能缺失的值,替代空指针或特殊标记,适用于函数返回值和可选配置项。 std::variant 提供类型安全的联合类型,支持多种异构数据存储,需配合std::visit访问。 std::span 作为轻量级连续内存视图,统一数组/容器的访问接口,避免数据拷贝。 三者可组合使用:如用optional包装span表示可能为空的数据视图,或用variant封装多种数据源类型。性能方面,optional/vari

qq2745567641的博客 1874

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++20 标准中的 std::span:轻量级视图,高效处理连续内存区域

C++20 标准中的std::span为开发者提供了一种高效、通用且安全的方式来处理连续内存区域。通过封装指针和长度信息,std::span简化了代码,提高了代码的可读性和可维护性。无论是在数组还是等数据结构上,std::span都能发挥其优势,成为 C++ 开发者工具箱中的有力工具。

799

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【ChatGPT教我编程】c++20 视图 , std::span

c++20 视图 , std::span

m0_48739934的博客 637

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入浅出 C++20:使用 std::span 打造安全与高性能的现代接口

C++20引入的std::span是现代C++内存管理的重要工具,它提供了一种非拥有视图来封装连续内存序列。文章深入解析了std::span的核心优势:统一接口、安全边界检查和极高性能。通过剖析其内存布局和subspan功能,阐述了其高效实现原理。最佳实践部分强调应直接按值传递std::span,并提供正确使用示例。最后总结了常见误区,指出std::span能有效消除C风格API的脆弱性,同时保持执行效率,是重构旧代码的理想选择。

greenspan的专栏 434

C++20特性-------std::span

std::span是一个轻量级的视图类型,用于表示一段连续的内存区域。它不拥有数据,而是提供对现有数组、容器或内存区域的非拥有(non-owning)视图。允许你在不复制数据的情况下处理这些数据。std::span是一个非常有用的工具,特别是在需要处理连续内存块而又不想复制数据的情况下。它提供了更好的安全性和代码可读性,使得处理数组和容器变得更加方便和直观。

路虽远,行则将至 689

C++20中的std::span:高效处理连续内存的轻量级视图

本文深入解析C++20中的std::span,这是一个用于高效处理连续内存的轻量级非拥有视图。文章详细介绍了std::span如何替代传统的“指针+长度”参数,统一处理数组、vector等数据源,并通过实战案例展示了其创建、核心操作、性能优势及最佳实践,帮助开发者编写更安全、更通用的C++现代代码。

weixin_29000991的博客 380

C++20实战:用std::span替代传统数组传参的5个理由(附性能对比)

本文探讨了C++20中std::span替代传统数组传参的五大优势,包括自动携带长度信息、统一容器接口、零开销性能、安全边界检查以及与现代C++生态的完美契合。通过实际代码示例和性能对比,展示了std::span在提升代码安全性和可读性方面的显著效果,是C++20开发者的必备工具。

nginx7reverse的博客 582

C++20 std::span:零开销连续内存视图,提升代码安全与性能

在C++编程中,处理数组、缓冲区等连续内存数据时,传统方法如指针加长度或迭代器对存在易出错、语义模糊等问题。std::span作为C++20引入的非拥有性视图,提供了一种统一、安全且高效的解决方案。其核心原理是封装一个指针和长度,以零开销抽象的方式观察和引用一段连续内存,不管理数据生命周期。这一设计遵循C++的“零开销抽象”哲学,在保持与原生指针同等性能的同时,通过清晰的接口和可选边界检查提升了代码安全性。在技术价值上,std::span实现了数据存储与访问的解耦,增强了函数接口的通用性和代码可读性。其应用

weixin_34005090的博客 234
上一篇: 严格弱序再理解
下一篇: std::type_index
audi2
博客等级 码龄18年 11粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值