[原创](Modern C++)现代C++的关键性概念: array<>比内置数组更安全

server/2025/3/23 10:04:50/

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

[序言]
在C++编程中, 数组作为一种基础数据结构, 广泛应用于各种场景. 然而, 传统的内置数组(即 C 风格数组)虽然简单高效, 却在易用性和安全性上存在不少缺陷. 例如, 内置数组缺乏直接获取元素数量的方法, 容易发生越界访问, 且在指针操作中容易引发混淆. 为了解决这些问题, 现代C++引入了std::array<>模板类. std::array<>不仅保留了内置数组的高性能优势, 还通过封装和接口设计提供了更高的安全性和便利性. 

[代码演示]

#include <iostream>
#include <array>
#include <algorithm>
#include <io.h>
#include <fcntl.h>int main() {_setmode(_fileno(stdout), _O_WTEXT); // 设置输出模式为宽字符,适用于中文环境std::array<int, 5> array_Int{1, 2, 3, 4, 5}; // 使用std::array定义数组int array_OldStyle_Int[5]{1, 2, 3, 4, 5};    // 使用传统内置数组定义// 获取大小int int_Size = sizeof(array_OldStyle_Int); // sizeof返回字节数int_Size = array_Int.size();               // size()返回元素数量// 获取指针int* pint_OldStyle = array_OldStyle_Int;   // 内置数组名即为指针,隐式转换pint_OldStyle = array_Int.data();          // std::array需显式调用data()获取指针// 查找元素auto int_Found = std::find(array_Int.cbegin(), array_Int.cend(), 3); // 使用STL算法查找std::cin.get(); // 暂停程序以查看输出return 0;
}

[代码说明]
下面将对代码中的关键部分进行详细说明, 突出std::array<>相比内置数组的优势:
1. 获取大小
   内置数组: sizeof(array_OldStyle_Int)返回的是数组占用的总字节数, 例如在这个例子中是 5 * sizeof(int). 若要计算元素数量, 需手动除以单个元素的大小 (如 sizeof(int)), 这种方式繁琐且容易出错.
   std::array<>: 通过size()成员函数直接返回数组的元素数量(这里是 5), 无需额外计算, 使用更直观且不易出错.

2. 获取指针
   内置数组: array_OldStyle_Int在需要指针的场景下会隐式转换为指向首元素的指针. 虽然方便, 但这种双重身份(既是数组名又是指针)容易导致代码理解上的混淆, 尤其在复杂操作中可能埋下隐患.
   std::array<>: 需要通过data()成员函数显式获取指向底层数据的指针. 这种显式性增强了代码的可读性, 避免了隐式转换带来的潜在风险.

3. 查找元素
   内置数组: 若要查找特定元素(如 3), 需要手动编写循环, 或者搭配std::find时需自行计算起始和结束位置(如 array_OldStyle_Int 和 array_OldStyle_Int + 5). 这种方式增加了代码复杂度, 且容易因边界计算错误导致问题.
   std::array<>: 提供了cbegin()和cend()成员函数, 返回指向数组开头和结尾的常量迭代器, 可以直接与STL算法(如 std::find) 无缝配合. 这种设计简化了代码, 提高了效率和安全性.

[总结]
std::array<>相较于传统内置数组的核心优势: 更高的易用性, 更高的安全性, 与 STL 的良好兼容性, std::array<>在保留内置数组性能优势的同时, 通过现代化的设计弥补了其缺陷. 在现代C++编程中, 推荐优先使用std::array<>替代传统的内置数组, 以提升代码的安全性, 可读性和可维护性.

文章来源:https://blog.csdn.net/Code_GodFather/article/details/146309350
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/176693.html

相关文章

Redis 三主三从集群部署的完整方案

一、架构设计原理‌ 分布式数据分片 哈希槽机制‌&#xff1a;Redis Cluster 将数据划分为 16384 个槽位&#xff0c;每个主节点负责部分槽位&#xff08;如主节点1管理槽0-5460&#xff0c;主节点2管理5461-10922等&#xff09;。 自动负载均衡‌&#xff1a;数据按哈希值分配…

Excel Script Lab学习笔记

注意 The Excel JavaScript API 没有“Cell”对象或类。 相反&#xff0c;Excel JavaScript API 将所有 Excel 单元格定义为 Range 对象。 Excel UI 中的单个单元格转换为 Excel JavaScript API 中包含一个单元格的 Range 对象。 单个 Range 对象也可以包含多个连续的单元格。…

Android启动流程源码分析

Android启动流程源码分析 一、前言 Android系统的启动是一个复杂的过程,涉及从底层Linux内核到上层应用的多个阶段。本文将深入分析Android系统的启动流程,帮助读者理解系统是如何从按下电源键到显示桌面的。 二、启动流程概述 2.1 启动阶段 Boot ROM和Bootloader 加载引…

网络安全常识科普(百问百答)

汪乙己一到店&#xff0c;所有喝酒的人便都看着他笑&#xff0c;有的叫道&#xff0c;“汪乙己&#xff0c;你又监控员工隐私了&#xff01;”他不回答&#xff0c;对柜里说&#xff0c;“来两个fofa。”便排出三个比特币。他们又故意的高声嚷道&#xff0c;“你一定又在电报群…

VSCode C/C++ 环境搭建指南

一、前言 Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款轻量级且功能强大的跨平台代码编辑器&#xff0c;凭借丰富的插件生态和高度的可定制性&#xff0c;深受开发者喜爱。对于 C/C 开发者而言&#xff0c;在 VSCode 中搭建开发环境&#xff0c;能够获得灵活…

力扣题目汇总 使用贪心算法解决问题

贪心算法是一种通过局部最优解来获得全局最优解的算法。它的核心思想是&#xff1a;在每一步中选择当前看起来最优的解&#xff0c;并希望通过一系列局部最优选择最终得到全局最优解。 121.买卖股票的最佳时机 分析&#xff1a; 在每一天求出当前最优的利润&#xff0c;也就…

华为海思 CPU「麒麟 X90」曝光

2025 年 3 月 15 日&#xff0c;中国信息安全评测中心发布安全可靠测评结果公告&#xff08;2025 年第 1 号&#xff09;&#xff0c;华为海思麒麟 X90 处理器首次曝光&#xff0c;其安全可靠等级评测结果为 II 级。相关信息如下&#xff1a; 架构与制程&#xff1a;采用华为自…

excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果输出到json文件

import pandas as pd import json# 1. 读取 Excel 文件&#xff08;假设列名为 question 和 answer&#xff09; try:df pd.read_excel("input.xlsx", usecols["question", "answer"]) # 明确指定列 except Exception as e:print(f"读取文…