相关解答一:堆,栈,堆栈的区别 .
一个程序一般分为3段:text段,data段,bss段
text段:就是放程序代码的,编译时确定,只读,
data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写
就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域
bss段:定义而没有赋初值的全局变量和静态变量,放在这个区域
这个够不够清楚呢?
堆栈就是栈的简称。
堆和栈的区别
一、预备知识—程序的内存分配
一个由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 在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456 放在常量区,编译器可能会将它与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下,栈的......余下全文>>
相关解答二:为什么要用堆栈,什么是堆栈
粘帖一个:
堆(heap)和栈(stack)有什么区别??
简单的可以理解为:
heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。
预备知识—程序的内存分配
一个由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在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与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下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储......余下全文>>
相关解答三:什么是堆栈及堆栈的作用是什么
堆栈是小说中常用的人物塑造方法,通常是为一个小人物所用。举个例子,某剑客非常之吊,被称为天下无敌。可是,一个小人物在与他正面的斗争中,不用任何手段就击败了他,表现出他惊人的实力。这就是对这个小人物的堆栈,为的就是把他通过别人巨大实力的转换成这个人物的威望。这就是堆栈
相关解答四:什么是堆栈?堆栈有何作用?
满意答案 热心问友 2011-06-22堆栈其实是数据结果中的两个概念 ,是存放数据的方式,堆:顺序随意;栈:后进先出(Last-In/First-Out)。要说用处,那就是在写代码的时候,有时数据存取肯定是要有规定的顺序的,这个是你自己规定的,然后按照你所写程序的用处的特点来用堆还是栈还是队列之类的顺序 追问: 程序设计时,为什么要对堆栈指针SP重新赋值? 回答: 这不是初始化嘛堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。它的特点是按照先进后出的原则存取数据,这里的进与出是指进栈与出栈操作。80C51片内RAM的部分单元可以用做堆栈。有一个8位的堆栈指针寄存器SP,丹用于指出当前堆栈顶部是片内RAM的哪一个单元。80C51单片机系统复位后SP的初值为07H,也就是将从内部RAM的08H单元开始堆放信息。但是,80C51系列的栈区不是固定的,只要通过软件改变SP寄存器的值便可更动栈区。为了避开工作寄存器区和位寻址区,SP的初值可置为2FH或更大的地址值。如果CPU在操作中要使用两组工作寄存器,如果不使用位变量,SP的初值至少应为0FH或更大的值;如果使用位变量,SP的初值至少应为2FH或更大的值;KeilC51编译器会自动计算SP的初始设定值,无需编程者关心。
相关解答五:CS5中堆栈咋用
堆栈描述
图像堆栈将一组参考帧相似、但品质或内容不同的图像组合在一起。将多个图像组合到堆栈中之后,您就可以对它们进行处理,生成一个复合视图,消除不需要的内容或杂色。
可以使用图像堆栈在很多方面增强图像:
减少法学、医学或天文图像中的图像杂色和扭曲。
从一系列静止照片或视频帧中移去不需要的或意外的对象。例如,您可能需要移去从图像中走过的人物,或移去在拍摄的主题前面经过的汽车。
图像堆栈将存储为智能对象。可以对堆栈应用的处理选项称作堆栈模式。将堆栈模式应用于图像堆栈属于非破坏性编辑。可以更改堆栈模式以产生不同的效果;堆栈中的原始图像信息保持不变。要在应用堆栈模式之后保留所做的更改,请将结果存储为新图像或栅格化智能对象。可以手动或使用脚本来创建图像堆栈。
创建图像堆栈
要获得最佳结果,图像堆栈中包含的图像应具有相同的尺寸和极其相似的内容,如从固定视
点拍摄的一组静态图像或静态视频摄像机录制的一系列帧。图像的内容应非常相似,以使您能够将它们与组中的其它图像套准或对齐。
1.将单独的图像组合到一个多图层图像中。请参阅复制图层。
注: 一个图像堆栈必须包含至少两个图层。
也可以使用脚本(“文件”>“脚本”>“将文件载入堆栈”)来组合图像。
2.选择“选择”>“所有图层”。
注: 要使“所有图层”命令能够选择背景图层,必须先将背景图层转换为常规图层。
3.选择“编辑”>“自动对齐图层”,然后选择“自动”作为对齐选项。如果“自动”选项操作未完全套准图层,请尝试“调整位置”选项。
4.选择“图层”>“智能对象”>“转换为智能对象”。
5.选择“图层”>“智能对象”>“堆栈模式”,然后从子菜单中选择堆栈模式。
要减少杂色,请使用“平均值”或“中间值”增效工具。
要从图像中移去对象,请使用“中间值”增效工具。
输出的是与原始图像堆栈的大小相同的复合图像。可能需要试验不同的增效工具以最大程度地增强特定图像。
要更改渲染效果,请从子菜单中选择其它堆栈模式。堆栈渲染不是累积的,即每种渲染效果将作用于堆栈中的原始图像数据并替换以前的效果。
堆栈模式
堆栈模式只基于每通道起作用,并且仅作用于非透明像素。例如,“最大值”模式将为像素横截面返回最大的红绿蓝通道值,并将这些值合并到已渲染图像中的一个复合像素值中。
熵
熵 = - sum( (值的概率) * log2(值的概率) )
值的概率 = (值的出现次数) / (非透明像素的总数)
二元熵(或零阶熵)定义对一个组中的信息进行无损编码所需的位数的下限。
相关解答六:堆栈的作用是什么
栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入俯的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
相关解答七:什么是堆栈??
堆栈是一种执行“后进先出”算法的数据结构。
设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址耿动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。
堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。
#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};
相关解答八:堆栈有哪些功能
堆栈应用非常广的 栈LIFO(后进先出) 1、洗盘子。用过的盘子一个一个叠放,那么最上面的盘子先洗,然后是下面的。 2、递归函数返回地址。程序先执行的函数地址扔到最底下,直到递送到有明确返回值函数地址 后,在归回上一层处理它,直到最底部函数都处理完。
相关解答九:如何使用 starstail 堆栈
不借助任何滤镜系统,只有裸机裸镜,在强光下玩超长慢门效果
让夜景、星轨的噪点彻底消失,从此不再惧怕高ISO和长曝噪点
这并非空穴来风,也不是什么神机妖镜,您和您手头的设备就可以做到!
你只需要不停地按下快门,剩下的会由后期搞定
这就是堆栈技术,也可以叫做连拍叠加法,或者俗点的说法就是:裸拍法 :D
堆栈技术的前后期都很简单,关键词:无ND、上脚架、多张连拍、后期叠加合成
一.无ND
就是不用在镜头前套一个或者多个中灰密度镜,正常测光,快门是多少就用多少
放心拍吧!剩下的交给连拍和合成
二.上脚架
其作用不必多说,但我想说的是,有时不用脚架也可以完成长曝效果,晕了吗?
这就是白日裸拍(白日裸拍是堆栈法的曾用名~ )的亮点之一:因为可以用后期图层对齐啊
当然这是个无奈之举,图像质量一定会有影响,对齐运算太耗时,而且未必成功
三.多张连拍(重点)
M档锁定光圈和快门,对焦也是M档,然后,用你的遥控/线控开始连拍吧!
这步之所以是重点,在于两次连拍之间的时间间隔的选择
根据拍摄的对象,分两种情况,移动的对象和同一位置多次出现的对象
对于重复出现的对象,比如海浪,要想雾化的话,其实间隔多长时间都可以,
甚至可以手动控制间隔时间,专门选择浪拍上来和退下去两个时间点,积累到一定张数即可
对于移动的对象,比如要做拉丝白云这道菜,那么就要根据云朵移动的速度来选择间隔时间
移动较快的话需要较小的间隔(比如一两秒或者更小),反之就间隔长点儿(比如十几秒),
这样多张合成后能看出运动的"平滑轨迹"而察觉不到运动的"停顿脚步"
至于一共要拍摄多少张,则根据情况和个人需求而定,几十或上百张(甚至几百张)都可以
想得到更好的降噪效果、更慢的慢门效果、更好的动态范围,那么就尽量多拍,多实践多总结
相关解答十:堆栈有哪些功能?
以保护CPU现场,有可能被覆盖:先进后出的RAM区:为子程序调用和中断操作而设置的,保护现场,具体功能有两个:保护断点。
赋值原因,如果定义的数据存放的地址也比较小的话:初始化时,堆栈设置的SP值比较小,SP=7,程序易出错作用。
堆栈
百度搜索“爱华网”,专业资料,生活学习,尽在爱华网