湖北网站设计制作多少钱,东莞有什么好厂,无锡做网站多少钱,卫龙的网站是谁做的2023年8月20日#xff0c;周日早上
感觉很多东西还没吃透#xff0c;很多疑问还没解决。
这篇文章可能会不定期更新。
还没解释为什么栈的空间有限#xff0c;而堆的空间很大
还没解释栈和堆在内存中的位置
...... 目录
怎么申请栈空间语法举例说明 怎么申请堆空间语法…
2023年8月20日周日早上
感觉很多东西还没吃透很多疑问还没解决。
这篇文章可能会不定期更新。
还没解释为什么栈的空间有限而堆的空间很大
还没解释栈和堆在内存中的位置
...... 目录
怎么申请栈空间语法举例说明 怎么申请堆空间语法举例说明注意栈空间有多大Linux Windows堆空间有多大堆和栈的区别是什么为什么要有堆全用栈不行吗为什么要有栈用代码说明堆和栈的一些区别用栈用堆 堆和栈都是内存中的一部分,
或者说堆和栈属于内存空间。 怎么申请栈空间
语法
数据类型 名称;
举例说明
#includeiostreamclass A{};struct B{};int main(){int i; //申请栈空间存储intdouble d; //申请栈空间存储doublestd::string s; //申请栈空间存储stringB b; //申请栈空间存储结构体BA a; //申请栈空间存储类A
}
怎么申请堆空间
语法
数据类型 *名称 new 数据类型;
举例说明
#includeiostreamclass A{};struct B{};int main(){int *inew int; //申请堆空间存储intdouble *dnew double; //申请堆空间存储doublestd::string *snew std::string; //申请堆空间存储stringB *bnew B; //申请堆空间存储结构体BA *anew A; //申请堆空间存储类A
}
注意
new和delete一定要配套否则会出现内存泄漏。当电脑的内存泄漏太多时就会因为无内存使用而导致程序崩溃。
栈空间有多大
Linux
在Linux中可以通过如下命令查看操作系统的栈空间大小
ulimit -a 或 ulimit -s 可以看到在我的Linux上栈空间大约只有8M的大小 Windows
我没找到查看栈空间大小的指令听说Windows的栈空间大小在2M左右。 堆空间有多大
我也没找到查看堆空间大小的指令不过可以肯定的是
堆空间非常大而且要远远大于栈空间。 堆和栈的区别是什么
它们在以下几个方面有所不同
分配方式栈内存由编译器自动分配和释放而堆内存需要程序员手动申请和释放。
分配速度栈内存的分配和释放速度较快仅需要移动指针即可完成。而堆内存的分配和释放速度相对较慢需要在堆中搜索合适的空间。
空间大小栈内存的大小通常有限由编译器或操作系统预先确定一般较小。而堆内存的大小相对较大取决于系统的可用内存大小。
数据访问栈内存的数据访问速度较快因为它们存储在物理内存中的连续地址空间上。而堆内存的数据访问速度较慢因为它们是通过指针进行间接访问的。
生命周期栈内存中的数据的生命周期与其所属的函数或代码块的执行周期相对应。而堆内存中的数据可以在程序的任何地方进行手动分配和释放生命周期更加灵活。
碎片问题栈内存不容易产生碎片问题因为分配和释放是按照先进先出LIFO的方式进行。而堆内存容易产生内存碎片因为分配和释放的顺序不一定是连续的。
需要根据程序的需求合理选择使用栈或堆内存来存储数据。栈主要用于存储局部变量和函数调用信息而堆主要用于存储动态分配的数据如对象、数组等。 为什么要有堆全用栈不行吗
当然不行前面说过堆的空间远远大于栈的空间。当需要存储非常大的数据在内存中时栈根本顶不住因为栈的空间太有限了只有堆才有足够的空间来存储。
也就是说堆的优势在于空间够多。 为什么要有栈
栈是一个先进先出的数据结构没有栈不好管理函数的调用和返回
栈用于存储函数调用期间的局部变量和函数参数。每当函数被调用时栈会为该函数分配一块内存空间用于存储其局部变量和临时数据。当函数执行完毕后该内存空间会自动释放以便为其他函数调用提供空间。
也就是说栈的优势在于先进先出的结构特性。 用代码说明堆和栈的一些区别
用栈
可以看到类A的对象a1在离开了作用域后内存就被回收了
#includeiostream
#includewindows.h
using namespace std;class A{public:A(){cout分配内存endl;}~A(){cout收回内存endl;}
};int main(){{A a1; //申请一块栈内存来存储类A}while(1){Sleep(1000);cout...endl;}} 用堆
可以看到用堆来存储时即使离开了作用域内存也没被回收
#includeiostream
#includewindows.h
using namespace std;class A{public:A(){cout分配内存endl;}~A(){cout收回内存endl;}
};int main(){{A *pnew A; //申请一块堆内存来存储类A}while(1){Sleep(1000);cout...endl;}}