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

C++ Core Guidelines 中文版 GSL

C++ GSL(Guideline Support Library)是由 Microsoft 开发的一个开源库,旨在提供一组通用的 C++ 标准库扩展,以支持 C++ 标准委员会提出的指导原则。GSL 为 C++ 开发人员提供了许多有用的工具和类型,以帮助他们编写更安全、更高效的代码。

以下是 GSL 提供的一些重要组件和功能:

Bounds 检查:GSL 包括用于执行数组边界检查、迭代器有效性检查等的工具。这有助于避免数组越界访问和迭代器失效等问题。

  1. #include <iostream>
    #include <gsl/gsl>int main() {int data[] = {1, 2, 3, 4, 5};// 创建一个 span 对象来引用数组gsl::span<int> dataArray(data);// 使用 Expects 约定来确保数组不为空Expects(!dataArray.empty());// 检查数组边界并进行访问for (size_t i = 0; i < dataArray.size(); ++i) {std::cout << dataArray[i] << " ";}std::cout << std::endl;// 尝试越界访问数组try {int value = dataArray[dataArray.size()];  // 越界访问std::cout << "Value at index " << dataArray.size() << ": " << value << std::endl;} catch (gsl::fail_fast& ex) {std::cerr << "Caught gsl::fail_fast exception: " << ex.what() << std::endl;}return 0;
    }
    
  2. 不可变性:GSL 提供了 gsl::not_null 类型,用于表示指针或引用不能为空,从而帮助避免空指针异常。

  3. #include <iostream>
    #include <gsl/gsl>void printValue(gsl::not_null<int*> ptr) {std::cout << "The value is: " << *ptr << std::endl;
    }int main() {int value = 42;int* ptr = &value;// 传递指针给函数,使用 not_null 来确保指针不为空printValue(gsl::not_null<int*>(ptr));// 尝试传递空指针给函数int* nullPtr = nullptr;try {printValue(gsl::not_null<int*>(nullPtr));  // 这会引发错误} catch (gsl::fail_fast& ex) {std::cerr << "Caught gsl::fail_fast exception: " << ex.what() << std::endl;}return 0;
    }
    
  4. 算法和数据结构:GSL 包括一些额外的算法和数据结构,例如 span 类型,用于表示连续内存范围,并提供对该范围的安全访问。

  5. gsl::at

    实际上是一个用于访问数组或容器元素的函数。它提供了类似于标准库 at 函数的功能,但是在索引超出有效范围时,gsl::at 会触发断言而非抛出异常。

    以下是关于 gsl::at 的详细说明和代码使用示例:

    详细说明

    gsl::at 函数的语法如下:

  6. gsl::at(container, index);
    

    其中,container 是要访问的数组或容器对象,index 是要访问的元素的索引。

    当使用 gsl::at 函数时,如果索引超出了容器的有效范围,它会触发断言,导致程序终止。

    代码使用示例

    以下是一个使用 gsl::at 函数的示例代码,演示了如何安全地访问向量中的元素:

  7. #include <iostream>
    #include <gsl/gsl>
    #include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 访问向量中的元素for (int i = 0; i <= vec.size(); ++i) {std::cout << "Element at index " << i << ": ";try {std::cout << gsl::at(vec, i) << std::endl;} catch (const gsl::fail_fast& e) {std::cerr << "Out of range access: " << e.what() << std::endl;}}return 0;
    }
    
  8. 字符串视图:GSL 提供对字符串的视图类,如 string_span,用于安全地引用字符串而无需复制数据。

  9. 用于提供一种轻量级、非拥有式的字符串访问方式。这些视图类可以用于在不复制字符串内容的情况下进行字符串操作和访问,从而提高性能并减少内存开销。

    在 GSL 中,提供了两个主要的字符串视图类:gsl::cstring_spangsl::string_span。它们分别用于 C 风格字符串和 C++ 标准库字符串的视图。以下是关于这两个类的详细说明和代码使用示例:

    gsl::cstring_span 类

    gsl::cstring_span 类用于表示对 C 风格字符串的非拥有式视图,允许对字符串进行安全的访问和操作,而无需复制字符串内容。

    详细说明

    gsl::cstring_span 的基本用法如下:

    gsl::cstring_span strSpan = "Hello, GSL!";
    

    gsl::string_span 类

    gsl::string_span 类用于表示对 C++ 标准库字符串的非拥有式视图,同样允许对字符串进行安全的访问和操作,而无需复制字符串内容。

    详细说明

    gsl::string_span 的基本用法如下:

  10. std::string str = "Hello, GSL!";
    gsl::string_span strSpan = str;
    

    代码使用示例

    以下是一个简单的示例代码,演示了如何使用 gsl::cstring_spangsl::string_span 类来创建字符串视图并进行访问操作:

  11. #include <iostream>
    #include <gsl/gsl>int main() {// 使用 gsl::cstring_span 访问 C 风格字符串gsl::cstring_span strSpanC = "Hello, GSL!";std::cout << "String view using gsl::cstring_span: " << strSpanC << std::endl;// 使用 gsl::string_span 访问 C++ 标准库字符串std::string str = "Hello, GSL!";gsl::string_span strSpan = str;std::cout << "String view using gsl::string_span: " << strSpan << std::endl;return 0;
    }
    
  12. 约定:GSL 引入了一些编程约定,如 ExpectsEnsures,用于在代码中明确表达前置条件和后置条件。

  13. Expects 宏

  14. Expects 宏用于指定函数或代码块执行前的先决条件,如果先决条件不满足,将导致程序终止。通常用于检查参数的有效性或函数执行前的必要条件。

    详细说明

    Expects 宏的基本用法如下:

  15. #include <gsl/gsl>
    void example_function(int value) {Expects(value > 0 && "Value must be greater than 0");// 函数的其他逻辑
    }
    

    Ensures 宏

    Ensures 宏用于指定函数执行后的后置条件,如果后置条件不满足,同样会导致程序终止。通常用于确保函数执行后的状态或结果。

    详细说明

    Ensures 宏的基本用法如下:

  16. #include <gsl/gsl>
    int example_function(int input) {int result = input * 2;Ensures(result > 0 && "Result must be greater than 0");return result;
    }
    

    代码使用示例

    以下是一个简单的示例代码,演示了如何使用 ExpectsEnsures 宏来进行先决条件和后置条件检查:

  17. #include <iostream>
    #include <gsl/gsl>void divide(int dividend, int divisor) {Expects(divisor != 0 && "Divisor cannot be zero");int result = dividend / divisor;Ensures(result >= 0 && "Result must be non-negative");std::cout << "Result of division: " << result << std::endl;
    }int main() {divide(10, 2);divide(20, 0); // 这里违反了 Expects 的先决条件,将导致程序终止return 0;
    }
    

对于 C++ 开发人员来说,GSL 是一个非常有用的工具库,可以帮助他们编写更加健壮和安全的代码。它有助于避免常见的程序错误,如空指针访问、越界访问等,并通过引入新的类型和约定,提高了代码的可读性和可维护性。

相关文章:

C++ Core Guidelines 中文版 GSL

C GSL&#xff08;Guideline Support Library&#xff09;是由 Microsoft 开发的一个开源库&#xff0c;旨在提供一组通用的 C 标准库扩展&#xff0c;以支持 C 标准委员会提出的指导原则。GSL 为 C 开发人员提供了许多有用的工具和类型&#xff0c;以帮助他们编写更安全、更高…...

同时显示上下两层凸包特征的可视化程序

数据类型 std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_k_upper std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_k_lower std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_underk_upper std::vector<…...

Django框架之模型层(二)

【十二】Django中如何开启事务 事务是MySQL数据库中得一个重要概念 事务的目的&#xff1a;为了保证多个SQL语句执行成功&#xff0c;执行失败&#xff0c;前后保持一致&#xff0c;保证数据安全 【1】ACID是数据库事务的四个关键特性 它代表了原子性(Atomicity)、…...

C++之list

C之list list的构造 #include <iostream> #include<list> using namespace std;//打印函数 void printfList(const list<int>&L) {for(list<int>::const_iterator it L.begin();it ! L.end();it){cout<<*it<<" ";}cout<…...

C语言日记——调试篇

一、调试调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法 对程序错误予以改正&#xff0c;重新测试 二、Debug和Release Debug通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…...

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——templates模板、静态文件、djang…...

Android设计模式--观察者模式

时间是一只藏在黑暗中温柔的手&#xff0c;在你一出神一恍惚之间&#xff0c;物走星移 一&#xff0c;定义 观察者模式是定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新 字面意思很好理解&am…...

【Linux】Ubuntu16.04下安装python高版本--源码安装

Ubuntu16.04下完美安装python高版本及对应版本的pip 方法一:直接用命令安装python3.6&#xff08;但我没安装成功&#xff09; 好像是因为Ubuntu16.04的软件仓库&#xff08;源&#xff09;中python的最高版本就是python3.5&#xff0c;所以无法直接用apt来安装 #方法一 sudo…...

变长子网划分问题的二叉树解法

计网的变长子网划分、计组的变长操作码划分、数据结构的哈夫曼编码&#xff0c;都是前缀编码的本质&#xff08;变长操作码的二叉树解法我还在琢磨中&#xff09; 【二叉树解法】每条从叶结点到根节点的路径上有且只有一个被分配的结点&#xff1a; 【例】现将一个IP网络划分成…...

编译安装redis及配置多实例

yum安装是这种十分简单的方法我们就不在提及了&#xff0c;今天我们来做一下redis的编译安装 Redis源码包官方下载链接&#xff1a;http://download.redis.io/releases/ 一、编译安装&#xff1a; 安装依赖包 dnf -y install make gcc jemalloc-devel systemd-devel如果是…...

网络(一)总纲

一 总纲 ① 背景 1、该资料不管是在华为内部还是外部都是很出名的2、该教程仅仅作为个人笔记,形成自己的网络知识体系,自己会按照教程手把手做实验,copy图谱备注&#xff1a; 自己没有处理过物理网和虚拟网,所以会以一个小白的角度去理解,可能存在偏差3、立足点&#xff1a…...

WPF中的App类介绍

在WPF (Windows Presentation Foundation) 应用程序中&#xff0c;App 类扮演着很重要的角色。这个类通常在每个WPF应用程序中都会有&#xff0c;并且生成在App.xaml文件和其代码后台App.xaml.cs中。App类通常继承自System.Windows.Application类&#xff0c;并且有以下的主要职…...

.nc格式文件的显示及特殊裁剪方式

最近我们遇到一个nc格式的文件&#xff0c;需要将它做成报告插图&#xff0c;bing搜索一番以后&#xff0c;了解到nc的全名为NetCDF(network Common Data Form)&#xff0c;是一种网络通用数据格式&#xff0c;广泛用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。…...

为什么需要线程池?C++如何实现一个线程池?

为什么需要线程池&#xff1f;C如何实现一个线程池&#xff1f; 为什么需要线程池&#xff1f;C如何实现一个线程池&#xff1f;...

多视图聚类的论文阅读

当聚类的方式使用的是某一类预定义好的相似性度量时&#xff0c; 会出现如下情况&#xff1a; 数据聚类方面取得了成功&#xff0c;但它们通常依赖于预定义的相似性度量&#xff0c;而这些度量受原始方法的影响:当输入维数相对较高时&#xff0c;往往是无效的。 1. Deep Mult…...

shell脚本适用场景

1.适用场景 Shell脚本是一种用于自动化和批量处理任务的脚本语言。它通常在Unix/Linux系统中使用&#xff0c;并且被广泛应用于各种场景&#xff0c;包括但不限于以下几个方面&#xff1a; 自动化任务&#xff1a;Shell脚本可以用于编写自动化脚本&#xff0c;完成一系列重复性…...

Bash openldap同步AD组织数据

将AD的ou同步到openldap&#xff08;可支持全量同步和增量同步&#xff09; 整体思路如下&#xff1a; 从ad导出所有的数据&#xff0c;然后进行参数替换以及处理&#xff0c;处理后的文件称为A&#xff1b;从openldap导出所有的数据&#xff0c;然后进行参数替换以及处理&am…...

C#WPF文本转语音实例

本文介绍C#WPF文本转语音实例 实现方法:使用类库(SpeechSynthesizer )实现的。 一、首先是安装程序包。 二、创建项目 需要添加引用using System.Speech.Synthesis; UI界面 <Windowx:Class="TextToSpeechDemo.MainWindow"xmlns="http://schemas.micr…...

08-流媒体-RTMP拉流

整体方案&#xff1a; 采集端&#xff1a;摄像头采集&#xff08;YUV&#xff09;->编码&#xff08;YUV转H264&#xff09;->写封装&#xff08;&#xff28;264转FLV&#xff09;->RTMP推流 客户端&#xff1a;RTMP拉流->解封装&#xff08;FLV转H264&#xff09…...

一键免费去除视频水印和字幕的AI工具

最近有学员经常让我分享好用的智能抹除视频水印字幕AI工具&#xff0c;今天就给大家分享一个我经常用到的这款工具——腾讯智影&#xff0c;这个平台提供的智能抹除功能&#xff0c;借助这个工具我们可以将视频中不需要的字幕或者水印删除掉。 不过这款工具每天有三次免费次数…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...