stack和heap的区别
The difference between stack and heap memory allocation
Posted: 11th August 2010 by Tim in C, C++, Software Development
Tags: alloc, allocation, C, coding, free, heap, malloc, memory, stack, stack
overflow
A common question amongst coders new to C or C++
relates to the difference between stack and heap memory allocation.
The answer lies in how the code is executed at the very lowest
level.
When a program is executed, each thread is
allocated a limited amount of stack space. The stack holds
information used by the program, including the raw byte code
executed on the processor.
Variables
allocated on the stack, or automatic variables, are stored directly
to this memory. Access to this memory is very fast, and
it’s allocation is dealt with when the program is compiled. Large
chunks of memory, such as very large arrays, should not be
allocated on the stack to avoid overfilling the stack memory (known
as stack overflow). Stack variables only exist in the block of
code in which they were declared. For example:
void a()
{
if(true)
{
int
x = 0;
}
x
= 1;
}
In
this code, x
is
allocated on the stack. This value is not available outside of
the if()
block,
so attempting to access the variable outside of the block, as
above, result in a compilation error.
Variables allocated on the heap, or dynamic
variables, have their memory allocated at run time (ie: as the
program is executing). Accessing this memory is a bit
slower, but the heap size is only limited by the size of
virtual memory (ie: RAM and swap space). This memory remains
allocated until explicitly freed by the program and, as a
result, may be accessed outside of the block in which it was
allocated. For example:
int *x;
void b()
{
if(true)
{
x
= malloc(sizeof(int));
}
*x
= 1;
}
void
c()
{
free(x);
}
In
this example, memory for the variable x
is
allocated when b()
is
called, and remains in memory until c()
is
called. Notice how we can set the value
of x
outside
of the if()
block
in which it is allocated.
In summary, temporary variables should be
allocated on the stack. It’s less mucking around with memory
allocation, the code is easier to read, the memory is accessed
faster and the program does not need to allocate the memory on the
fly. For large variables or arrays whose size may vary, heap
memory allocation is your friend. Just remember to free all
of the memory allocated or you’ll end up with memory
leaks.
一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放
,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放,
若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。4、文字常量区 —常量字符串就是放在这里的。
程序结束后由系统释放 。5、程序代码区—存放函数体的二进制代码。
stack和heap的区别的更多相关文章
- 面试题思考:Stack和Heap的区别
堆栈的概念: 堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常 ...
- stack,heap的区别
一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. ...
- 面试题思考:Stack和Heap的区别 栈和堆的区别
堆栈的概念: 堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常 ...
- Stack与Heap的区别
申明:这里所说的栈和堆是程序内存管理中的栈和堆,而不是数据结构里的栈和堆. (1)保存的内容不同:栈里保存的是局部变量,而堆里保存的是动态申请的变量. (2)栈里的内存系统自动申请和释放,程序执行出申 ...
- JAVA中Stack和Heap的区别
http://m.blog.csdn.net/wl_ldy/article/details/5935528
- 图解.NET Stack和Heap的本质区别
现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存.代码块内存是在 ...
- 【转】JVM运行原理及JVM中的Stack和Heap的实现过程
来自: http://blog.csdn.net//u011067360/article/details/46047521 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’( ...
- JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集
(转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...
- JVM运行原理及Stack和Heap的实现过程
Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在ja ...
随机推荐
- 存储过程被程序和第三方客户端执行很慢,而sql server management studio执行速度正常
来自:http://blog.csdn.net/pgbiao/article/details/22388945 原因分析:由于存储过程是预编译的, 在第一次执行的时候, 会生成执行计划, 以后执行的时 ...
- selenium - 截图下载图片
from selenium import webdriver from selenium.webdriver import ChromeOptions from time import sleep f ...
- CentOS升级GDB
需要先安装ncurses-devel和texinfo 如果不安装ncurses-devel,编译会出错 如果不安装texinfo或者版本太低,安装会出错 1.yum install -y ncurse ...
- 谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用
/*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源.合并结果集,这些都是比较消耗资源,但我们为能够减少执行事务的时间使用paral ...
- java自定义注解代码练习
/** * 自定义注解:校验非空字段 * */ @Documented @Inherited // 接口.类.枚举.注解 @Target(ElementType.FIELD) //只是在运行时通过反射 ...
- 分离vue文件,方便后期维护
参考: https://www.cnblogs.com/wy120/p/10179901.html https://blog.csdn.net/sinat_36146776/article/detai ...
- spring:AOP面向切面编程02
参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...
- 怎么取消主键自增长的问题(SQL Server)
以前经常会碰到这样的问题,当我们删除了一条自增长列为1的记录以后,再次插入的记录自增长列是2了.我们想在插入一条自增长列为1的记录是做不到的.我们可以通过设置SET IDENTITY_INSERT & ...
- IDEA修改git账号密码
wiin10:控制面板-凭据管理器-Windows凭据-普通凭据-git
- 使用movable-view制作可拖拽的微信小程序弹出层效果。
仿了潮汐睡眠小程序的代码.[如果有侵权联系删除 最近做的项目有个弹出层效果,类似音乐播放器那种.按照普通的做了一般感觉交互不是很优雅,设计妹子把潮汐睡眠的弹层给我看了看,感觉做的挺好,于是乘着有空仿照 ...