当前位置: 首页 > 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.jsqmd.com/news/71781/

相关文章:

  • 在河北唐山市曹妃甸区老家农村盖房子,自建房公司哪家靠谱?曹妃甸区自建房公司实用选择指南 - 苏木2025
  • 武汉水泥砖优质厂家排名(2025最新版),专业的水泥砖源头厂家哪家靠谱鑫俊熙市场认可度高 - 品牌推荐师
  • 2025年长三角五大卡牌印刷定制公司推荐:上海万通卡牌印刷工 - mypinpai
  • 2025年五大数控UG编程培训学校排名,学好UG编程/4轴U - myqiye
  • 2025-2026年表界面张力仪/泡压法张力仪/气泡压力张力仪排行榜,推荐市面上主要品牌及优质厂家 - 品牌推荐大师1
  • UEFI 随笔 009 — 在 UEFI Shell 下使用 USB 盘
  • 2025年北京ISO认证权威机构排名:ISO认证来样服务机构 - 工业品牌热点
  • 食品饮料门店管理痛点多?纷享销客CRM一招搞定
  • 如何筛选真正懂业务的山东AI公司?2025年年终基于市场实证的深度评估与5家推荐! - 十大品牌推荐
  • 2025智能洗头机厂家推荐榜:仪美天科技领跑,中日品牌共塑洗护新生态 - torzi_JavaScript
  • 2025年杭州艺术学校相关画室五大推荐,录取分数线/新校区/ - mypinpai
  • 2025年国内靠谱化肥专用管公司推荐:有实力的6479化肥专 - 工业品牌热点
  • 2025年12月电容厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • 想在青县老家农村盖房子,靠谱的自建房公司口碑推荐。河北省沧州市青县自建房公司 / 机构权威测评推荐排行榜 - 苏木2025
  • 【ACM出版 | EI检索】2026年人机交互、神经网络与深度学习国际学术会议(HNNDL 2026)
  • 投屏软件Scrcpy
  • 2025年少管所特训学校排行推荐,专业青少年成长护航机构全解 - 工业推荐榜
  • 2025河南推荐少管所特训学校TOP5:权威测评指南,甄选专 - myqiye
  • 东光县农村自建房找谁好?河北沧州东光县自建房公司 / 机构深度评测口碑推荐榜 - 苏木2025
  • C++学习笔记 05 虚函数
  • 深圳专业少儿芭蕾机构推荐,深度解析苏菲艺术教育的国际化基因与专业坐标 - 速递信息
  • onlyoffice documentserver Docker 容器化部署指南
  • 风险管理
  • 国产阀门企业盘点 - 速递信息
  • C++学习笔记 04 构造函数 和 析构函数
  • 2025年佛山债务纠纷律师事务所推荐:实力强的债务纠纷律师 - mypinpai
  • 原始字面量
  • 揭示2025重庆全屋定制供应商排行,主要有哪些优质厂家推荐? - 讯息观点
  • 【分布式利器:RocketMQ】2、RocketMQ消息重复?3种幂等优秀的方案,彻底解决重复消费(附代码实操)
  • 2025年12月飓丰4.2米保温车,飓丰纯电动保温车,飓丰小型保温车厂家推荐:冷链行业权威盘点与品质红榜发布​ - 品牌鉴赏师