一份不错的介绍“堆和栈的区别”的资料

[FPGA高速以太网]基于Verilog与1G/2.5G Ethernet PCS/PMA IP核的2.5G UDP通信实战 本文详细介绍了基于FPGA与1G/2.5G Ethernet PCS/PMA IP核实现2.5G UDP通信的完整实战方案。文章以黑金AX7A200开发板为硬件平台,深入讲解了从硬件选型、IP核配置、Verilog测试逻辑编写到系统调试与性能验证的全过程,重点剖析了利用SGMII接口与GTP收发器实现高速数据传输的关键技术与避坑指南,为FPGA高速以太网应用开发提供了宝贵经验。 阅读详情

原贴 http://topic.csdn.net/u/20090306/09/5EC55BDC-F2A9-4048-88B4-63616069DF31.html

 

堆和栈的区别(转贴,作者为一c++程序员,具体姓名不清楚)
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—> 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—> 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—>全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束后由系统释放
4、文字常量区—>常量字符串就是放在这里的。程序结束后由系统释放
5、程序代码区—>存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//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; //全局(静态)初始化区
p1 = (char *)malloc(10);
    p2 = (char *)malloc(20); //分配得来的和字节的区域就在堆区。
strcpy(p1, "123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。例如,声明在函数中一个局部变量int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程
序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是M(也有的说是M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
2.5堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,
程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作
和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

GraphRAG 踩坑记录 GraphRAG踩坑记录 阅读详情

相关推荐

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(四)-无人机系统(UAS)命令与控制(C2)通信用例

UTM向5G网络提供无人机系统C2通信所需的信息,例如服务类别、无人机系统服务的流量类型、授权的无人机系统服务所需的QoS以及无人机系统服务的订阅。遵循模型B的网络辅助C2模型,为了确保UAS操作的C2通信的服务可用性可靠性,特别是当无人机在操作员的视线之外(BLOS)飞行时,为无人机提供支持冗余的C2通信链路。如果需要创建额外的C2通信连接或更改现有数据连接的配置以进行C2通信,则5G网络会根据无人机系统的授权服务信息C2通信中所需的QoS优先级,修改或分配一个或多个C2通信流量的QoS流。

u011376987的博客 2017

区别详细介绍?看完面试不再慌

(heap)(stack)的区别 (1)申请方式 stack:由系统自动分配。例如,声明在函数中一个局部变量int b;系统自动在中为b开辟空间 heap:需要程序员自己申请,并指明大小,在c中malloc函数 如 p1=(char*)malloc(10); 在C++中用new运算符 如 p2=(char*)malloc(10); 但是注意p1、p2本身是在中的。 (2)申请后系统的响应 :只要的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示溢出.

qq_41293655的博客 239

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2850

详解

区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的。 2、区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的是两回事,分配方式倒是类似于链表,呵呵。

Curtain的博客 3801

简要谈谈区别

今天读了《Think in JAVA》一书的1.10部分,对象的创建生命周期,突然感觉这一部分是很常见又很容易被忽视的问题,故拿到此做一记录。区别区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的。对象的存储空间生命周期在编写程序时确定。这种方式将存储空间的分配释放放在首位,但是牺牲了灵活性,必须在编写程序时知道对象的数量、生命周期类型。区:一般

u012076339的博客 696

内存、数据结构区别

网上有一篇很好的文章,我差不多直接搬运过来了。 来源:http://www.cleey.com/blog/single/id/776.html 原文如下: 可能很多同学在这个概念上有些模糊,其实分为数据结构内存的。数据结构我想很多同学学习过,今天介绍数据结构,但是重点是内存的整理。 数据结构 首先在数据结构上要知道,尽管我们这么称呼它,但实际上

Jaybo 6460

看到的一份不错介绍区别”的资料 [转]

区别(转贴,作者为一c++程序员,具体姓名不清楚) 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、区(stack)—> 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的。 2、区(heap)—> 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的是两回事,分配方式倒是类似

少帅的天空 1512

看到的一份不错介绍区别”的资料

区别(转贴,作者为一c++程序员,具体姓名不清楚) 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、区(stack)—> 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的。 2、区(heap)—> 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的是两回事,分配方式倒是类似

D. Qiu的专栏 632

C语言入门——区别

在计算机领域,是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,是一个很模糊的概念。:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的汇编语言中的一词混为一谈。我身边的一些编程的朋友以

ai616818的专栏 3008

区别(内存数据结构

首先在数据结构上要知道,尽管我们这么称呼它,但实际上是两种数据结构都是一种数据项按序排列的数据结构

chensi16114的博客 3670

C语言中区别

在计算机领域,是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。 但对于很多的初学着来说,是一个很模糊的概念。:一种数据结构、一个在程序运 行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的汇编语言中 的一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不 清,所以我想有必要给大家分享一下我对的看法,

Fybon的专栏 1351

数据结构程序中的

原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 格式部分内容稍作修改。 在计算机领域,是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,是一个很模糊的概念。:一种数据结构、一个在程序运行时用于存放的地方,这可能是

zzgcrazy的专栏 3295

区别数据结构内存

数据结构 首先在数据结构上要知道,尽管我们这么称呼它,但实际上是两种数据结构都是一种数据项按序排列的数据结构就像装数据的桶或箱子 我们先从大家比较熟悉的说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。 这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体......

程序员们必读的博客,涵盖IT技术、编程经验等领域。 1330

区别

前言 原文地址:https://www.programmerinterview.com/data-structures/difference-between-stack-and-heap/ 之间的区别可能会困惑很多人,因此我们认为应该有一个关于的问题答案列表,并且我们认为它是非常有帮助性的。 问题1:存储在哪? 存储在计算机的RAM(随机存取存储器)中,更...

陈玉博的技术博客 416

区别(内存数据结构)

在计算机领域,是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,是一个很模糊的概念。:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的汇编语言中的一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清,所以我想有必要给大家分享一下我对的看法,有说的不对的地方请朋友们不吝赐教

wolenski的专栏 3万+

系统中使用管理内存的区别

一直对系统中的使用原则不太理解,在网上看到这篇文章,非常不错! 转载地址:http://bbs.csdn.net/topics/390147637 在计算机领域,是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,是一个很模糊的概念。:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的汇编语言中的

fulinwsuafcie的专栏 2078

java 数据结构_数据结构程序中的

在计算机领域,是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,是一个很模糊的概念。:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的汇编语言中的一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清,所以我想有必要给大家分享一下我对的看法,有说的不对的地方请朋友们不吝赐教...

weixin_32956805的博客 696

的通俗解释【转】

数据结构 首先在数据结构上要知道,尽管我们这么称呼它,但实际上是两种数据结构都是一种数据项按序排列的数据结构就像装数据的桶或箱子 我们先从大家比较熟悉的说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。 这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。 像...

复兴号之编程复兴 1203
上一篇: 在 Visual C++ 中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误
下一篇: CString,int,string,char*之间的转换
Gary@Tokyo
博客等级 码龄20年 315粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值