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

C++学习笔记 06 数组

一、数组的创建

  1. 栈分配:int example[5]; 方法结束栈空间自动释放
  2. 堆分配:int* arr = new int[5]; 需要手动删除
#include<iostream>int main() {//1. 栈上分配数组空间,当前方法结束自动释放空间(栈空间内存有限),不必手动删除int example[5];//2. 堆上分配内存空间,可以通过return返回int* arr = new int[5];//堆数组必须手动deletedelete[] arr;std::cin.get();
}

内存间接寻址(Memory Indirection)

一个指针,指向另一个指针
p1 --> p2 --> Arr

这会产生内存碎片和缓存丢失

栈空间分配数据直接寻址

堆数组在内存中对象区间存一个地址,需要跳转

对象数组属性在堆中数组数据

在类对象地址上再去找到另一个堆中地址(本对象中属性在堆中的地址),这意味着我们基本要在代码里跳来跳去,所以,如果可以,你应该在栈上创建数组来避免这种情况,因为这样的内存跳跃肯定会影响性能。

二、计算数组大小的注意事项

1. C++ 11 std::array

内置数据结构,定义在C++11 标准库中。很多人喜欢用它来替代原生数组,因为有很多优点,有边界检查,记录数组大小。我们没有办法计算原生数组大小。

2. 原生计算

sizeof(变量名) / sizeof(类型)不可信。只对栈分配有效,对堆指针分配方式无效

#include<iostream>
#include<array>//个人而言,总是用原生数组,大多数人都这么用,会更快一些。但如果你想安全,你可能想用std::array,
//std::array比原生数组安全得多,但我就喜欢危险
class Entity {
public://1. 必须是 static + const, 否则报错static const int stackArrSize = 5;int arr[stackArrSize];//2. 也可以用constexprstatic constexpr int stackArrSize2 = 5;int arr2[stackArrSize2];//3. 堆数组指针以非常量分配大小不存在编译问题int s1 = 5;int* arrP = new int[s1];//4. arraystd::array<int, 5> arrayInstance;//1. 栈上分配:栈上地址 + 偏移量。int arrStack[5];//2. 堆上分配,int* arrHeep = new int[5];Entity() {//int 4个字节 * 5个元素 =20个字节 / int 4个字节int count = sizeof(arrStack) / sizeof(int); // 5//int指针大小 8个字节(64位) / int 4个字节int count2 = sizeof(arrHeep) / sizeof(int); // 2std::cout << count << " vs " << count2 << std::endl; //5 vs 2//计算数组大小,用array当然比原生自定义数组会有额外开销,做边界检查,它也维护了一个整数类型size,实际你可能不需要size。//通常这些额外开销是值得的。std::cout << arrayInstance.size() << std::endl;}
};int main() {Entity e;//1. 栈上分配数组空间,当前方法结束自动释放空间(栈空间内存有限),不必手动删除int example[5];//2. 堆上分配内存空间,可以通过return返回int* arr = new int[5];//堆数组必须手动deletedelete[] arr;std::cin.get();
}

总结:你要自己维护数组大小。这确实很麻烦,但是C++就是这样工作的,你必须去维护它。

栈中分配数组注意事项

当你在栈中为数组申请内存时,它必须是一个编译时就知道的常量,所以必须用static标记。这里还可以用constexpr表达式。类中常量表达式必须是静态的。

常量分配数组size的错误❌️

http://www.zskr.cn/news/82312.html

相关文章:

  • 2025年长三角五大卡牌印刷定制公司推荐:上海万通卡牌印刷工 - mypinpai
  • UEFI 随笔 009 — 在 UEFI Shell 下使用 USB 盘
  • 2025年北京ISO认证权威机构排名:ISO认证来样服务机构 - 工业品牌热点
  • 如何筛选真正懂业务的山东AI公司?2025年年终基于市场实证的深度评估与5家推荐! - 十大品牌推荐
  • 2025年杭州艺术学校相关画室五大推荐,录取分数线/新校区/ - mypinpai
  • 2025年国内靠谱化肥专用管公司推荐:有实力的6479化肥专 - 工业品牌热点
  • 2025年12月电容厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • 2025年少管所特训学校排行推荐,专业青少年成长护航机构全解 - 工业推荐榜
  • 东光县农村自建房找谁好?河北沧州东光县自建房公司 / 机构深度评测口碑推荐榜 - 苏木2025
  • 风险管理
  • C++学习笔记 04 构造函数 和 析构函数
  • 2025年不锈钢螺母厂家推荐榜单:不锈钢螺丝‌/四方螺母‌/六角焊接螺母源头厂家精选 - 品牌推荐官
  • 【ACM出版 | EI检索】第五届大数据经济与数字化管理国际学术会议(BDEDM 2026)
  • 必看!2025年广东制冷量优质驻车空调品牌推荐 - 讯息观点
  • 2025年国内全自动粘钉一体机厂家权威推荐榜单,目前专业的全自动粘钉一体机公司哪家好优质品牌榜单更新 - 品牌推荐师
  • LINUX设备树
  • 2025年小型风力发电机厂家权威推荐榜单:微风发电/垂直轴风机发电机/太阳能发电系统源头厂家精选 - 品牌推荐官
  • 洗衣液品牌方会协助开发线下渠道吗?新手代理商必看真相 - 速递信息
  • 机器学习解析新闻引语:从定义到实体识别
  • 企业选对大旋风喷涂设备厂家指南:四川辉鑫机械是优选 - 朴素的承诺
  • windriver 第11章:提升PCI性能
  • 2025年超级电容公司TOP5权威推荐:看哪家售后服务优? - mypinpai
  • 2025年度实力强的发光字标识标牌定制生产厂家TOP5推荐: - 工业品牌热点
  • 2025叛逆教育机构TOP5权威推荐:深度测评指南,助力迷途 - 工业推荐榜
  • CPLD(复杂可编程逻辑器件,Complex Programmable Logic Device)是什么? - 详解
  • 2025国产超级电容公司TOP5权威推荐:甄选企业助力能源转 - mypinpai
  • 2025年12月地暖保温板,保温板,环保保温板厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • 2025年北京除甲醛权威推荐榜单:氧道净醛水漆/甲醛克星/甲醛净化精选与市场解析 - 品牌推荐官
  • 2025年中国十大发光字标识标牌定制厂家推荐:看哪家口碑好 - 工业品牌热点
  • 2025年国内恒温恒湿试验箱生产厂家推荐/恒温恒湿试验箱十大国产品牌/行业十大排名 - 品牌推荐大师