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的区别的更多相关文章

  1. 面试题思考:Stack和Heap的区别

    堆栈的概念: 堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常 ...

  2. stack,heap的区别

    一个由C/C++编译的程序占用的内存分为以下几个部分    1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其    操作方式类似于数据结构中的栈.    ...

  3. 面试题思考:Stack和Heap的区别 栈和堆的区别

    堆栈的概念: 堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常 ...

  4. Stack与Heap的区别

    申明:这里所说的栈和堆是程序内存管理中的栈和堆,而不是数据结构里的栈和堆. (1)保存的内容不同:栈里保存的是局部变量,而堆里保存的是动态申请的变量. (2)栈里的内存系统自动申请和释放,程序执行出申 ...

  5. JAVA中Stack和Heap的区别

    http://m.blog.csdn.net/wl_ldy/article/details/5935528

  6. 图解.NET Stack和Heap的本质区别

    现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存.代码块内存是在 ...

  7. 【转】JVM运行原理及JVM中的Stack和Heap的实现过程

    来自: http://blog.csdn.net//u011067360/article/details/46047521 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’( ...

  8. JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集

    (转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...

  9. JVM运行原理及Stack和Heap的实现过程

    Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在ja ...

随机推荐

  1. Vue项目组织规范

    目录 一.项目结构的核心思想 二.项目目录结构 三.资源路径编译规则 四.index.html 五.build目录 和 config目录 六.public目录 七.static 目录 八.src目录结 ...

  2. Java 10的10个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  3. Mysql之DQL------基础查询

    #笔记内容来自于B站尚硅谷教学视频(av49181542)use myemployees; 查询表中的单个字段 SELECT last_name FROM employees; 查询表中的多个字段 # ...

  4. Python - 作为浅拷贝的list对象乘法

    运行下面这段代码 # !/usr/bin/env python3 # -*- coding=utf-8 -*- temp_a = [[0]*2]*3 temp_b = [[0]*2 for i in ...

  5. 2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法

    title author date CreateTime categories Roslyn 让 VisualStudio 急速调试底层库方法 lindexi 2019-5-29 20:2:9 +08 ...

  6. Array.prototype.splice()

    splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容.此方法会改变原数组. 在1位置上添加一项 我们没有下标为4的项,这个超了,就在最大项后面添加这 ...

  7. 基本包装类型Boolean、Number、String特性及常用方法

    基本包装类型:Boolean.Number.String 一.String 字符串常用方法 1.indexOf()  lastIndexOf()  返回相应字符的索引号 2.slice(index1, ...

  8. java系统监控分析Jprofile下载及安装配置【转】

    JProfiler是一个全功能的Java剖析工具(profiler),专用於分析J2SE和J2EE应用程式.它把CPU.线程和记忆体的剖析组合在一个强大的应用中.JProfiler可提供许多IDE整合 ...

  9. 廖雪峰Java11多线程编程-3高级concurrent包-1ReentrantLock

    线程同步: 是因为多线程读写竞争资源需要同步 Java语言提供了synchronized/wait/notify来实现同步 编写多线程同步很困难 所以Java提供了java.util.concurre ...

  10. HZOI20190725 B 回家 tarjan

    题目大意:https://www.cnblogs.com/Juve/articles/11226266.html 题解: 感觉挺水的,但考场上没打出来 题目翻译一下就是输出起点到终点必经的点 其实就是 ...