千家信息网

怎么使用span解决数组退化和越界访问

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇文章给大家分享的是有关怎么使用span解决数组退化和越界访问,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。数组是C++从C语言继承过
千家信息网最后更新 2025年01月23日怎么使用span解决数组退化和越界访问

本篇文章给大家分享的是有关怎么使用span解决数组退化和越界访问,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

数组是C++从C语言继承过来的特性,使用方便同时又可以提供绝佳的性能,因此被广泛使用。但是简便的另一面就是风险,其中最大的两个问题就是退化(array decay)和越界访问(range errors)。本如何提前使用C++20新特性span解决数组退化和越界访问的问题。

首先看使用数组的最常见代码:

int data[10];for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); ++i) {    data[i] = 0;}

数组被定义时,同时有个元素个数信息。使用这个信息可以对数组进行操作。但是在将数组作为一个参数传递给某个函数时,只能以指针形式传递,这就是数组退化。为了正确把握数组的大小一般需要同时传递数组的大小信息。例如下面的初始化函数就是如此:

void init_data(int buffer[], size_t size){  cout << "size=" << size << endl;  for (gsl::index i = 0; i < size; ++i) {    buffer[i] = i;  }  buffer[4] = 40;  buffer[20] = 20;  //越界访问}

即使声明函数参数时形式上是数组,但所有的行为都和指针完全相同。还有一个问题就是,由于数组是一种完全暴露的数据结构,没有任何保护。例如代码中第8行,即使访问的第20个元素已经超过最初定义的10个元素,这种操作一般也会正常通过。但是接下来不知道哪个时刻,这个操作带来的影响就会以一种完全不相关的形式表现出来。数组大小信息获取,传递错误和越界操作具有引入容易、排查困难的特种,是许多程序员的噩梦。

为了解决这个问题,GSL引入了一个模板类span,它可以同时管理数组的地址和大小。这个类将从C++20开始成为C++的标准功能。

使用了span类的初始化函数如下:

void init_data(gsl::span buffer){    cout << "size=" << buffer.size() << endl;    int value = 0;    for (auto it = buffer.begin(); it != buffer.end(); it++) {        *it = value++;    }    buffer[4] = 10;    buffer[20] = 20; //会触发断言}

只要函数参数声明为:gsl::span buffer,大小信息就会由span模板类管理,接下来就可以像vector一样使用数组了。如果发生越界访问,会触发断言。

使用数组和span传递参数的示例代码如下:

int main(){    int data[10];    for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); ++i) {        data[i] = 0;    }    //使用数组传递参数    init_data(data, 5);    //使用span传递参数    init_data(data);    return 0;}

和使用数组的调用相比,增强功能(范围检查等)的同时还简化了数组的用法!

以上就是怎么使用span解决数组退化和越界访问,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

数组 参数 就是 信息 函数 同时 大小 问题 代码 元素 形式 接下来 功能 指针 更多 模板 特性 知识 篇文章 C++ 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 app 软件开发价格 在服务器中进行磁盘管理 河南盛商网络技术 网络安全法第六十七条 解读 互联网封面科技 中国有多少台国际服务器 山东出口外贸软件开发 网络安全渗透兼职平台 网络安全工作岗位 零件供应系统数据库设计与应用 天津质量软件开发供应商 腾讯云服务器管理器仪表板 壁挂前后双屏广告机服务器 上海正规网络技术解决方案 北京信息科技大学互联网工程 数据库自动增长设置后插入数据 专题学习网络安全三法一条例简报 富邦安全和网络技术有限公司 国泰君安数据库怎么查月度资料 服务器滑轨和托盘哪个好 数据库服务器代理自动停止 微信语音消息保存服务器多久 aced数据库 怀旧服公会服务器是哪个 同为服务器查不到录像 dga 网络安全 天津网络技术研究所218 企业数据库有哪些元素 dl388服务器什么品牌 视图有操作原来的数据库吗
0