基础知识篇

您所在的位置:网站首页 计算机内存算法是什么 基础知识篇

基础知识篇

2024-01-03 08:44| 来源: 网络整理| 查看: 265

文章目录 一、数据结构中的堆和栈1. 栈2. 堆 二、内存中的栈区与堆区1. 内存中的栈区与堆区比较2. 计算机内存的大致划分 三、栈内存与栈溢出四、堆内存与内存泄露五、JAVA1. Java中的堆与栈2. 引用变量3. 堆和非堆内存 六、《C++内存管理技术内幕》1. C++中,内存分成5个区a)栈b)堆c)自由存储区d)全局/静态存储区e)常量存储区 2. C++中,内存分成3个区a)静态存储区b)栈区c)堆区 七、堆和栈究竟有什么区别?总结

一、数据结构中的堆和栈 1. 栈

是一种连续储存的数据结构,具有先进后出的性质。

通常的操作有入栈(压栈),出栈和栈顶元素。想要读取栈中的某个元素,就是将其之间的所有元素出栈才能完成。

2. 堆

是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。

二、内存中的栈区与堆区 1. 内存中的栈区与堆区比较 栈区堆区Stack memory内存空间由操作系统自动分配和释放。Heap Memory内存空间手动申请和释放的,Heap Memory内存常用new关键字来分配。Stack Memory内存空间有限。Heap Memor的空间是很大的自由区几乎没有空间限制。 2. 计算机内存的大致划分

一般说到内存,指的是计算机的随机存储器(RAM),程序都是在这里面运行。

三、栈内存与栈溢出

由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出,即若分配失败,则提示栈溢出错误。

在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。

因此,能从栈获得的空间较小。

😒 注意,const局部变量也储存在栈区内,栈区向地址减小的方向增长。

#include int main() { int i = 10; //变量i储存在栈区中 const int i2 = 20; int i3 = 30; std::cout int* p = new int[5]; }

看到new,首先应该想到,我们分配了一块堆内存,那么指针p呢?   它分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。程序会先确定在堆中分配内存的大小,然后调用 operator new分配内存,然后返回这块内存的首地址,放入栈中。      注意:这里为了简单并没有释放内存,那么该怎么去释放呢? 是delete p么? NO,错了,应该是delete [ ]p,这是告诉编译器:删除的是一个数组。

//main.cpp int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c =0; // 全局(静态)初始化区 // 分配得来得10和20字节的区域就在堆区。 p1 = (char *)malloc(10); p2 = (char *)malloc(20); strcpy(p1, "123456"); // 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }

学习: https://www.cnblogs.com/jiudianren/p/5671992.html https://msd.misuland.com/pd/2884250137616452012



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3