`
ooaer
  • 浏览: 138584 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

C里面的函数堆栈同C++的函数堆栈的区别

    博客分类:
  • C++
阅读更多
五大内存分区
    在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
    自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
    全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
一般认为在c中分为这几个存储区:
    1. 栈 --有编译器自动分配释放
    2. 堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
    3. 全局区(静态区) -- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
    4. 另外还有一个专门放常量的地方。程序结束释放
    在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
代码:
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);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}


    还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
    栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
    堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
    在栈上存取数据比通过指针在堆上存取数据快些。
    一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。
转自 http://linsea.iteye.com/blog/260242
分享到:
评论

相关推荐

    C++高效获取函数调用堆栈

    C++高效获取函数调用堆栈 在程序设计和开发过程中,出现问题是很正常的。这时候,快速找到问题所在,并确定程序的上下文环境就变得非常重要。函数调用堆栈的信息对于解决问题具有很大的帮助。传统的方法是使用 ...

    堆栈的C++实现!!!

    在C++中实现堆栈可以利用STL(标准模板库)中的`stack`容器,但也可以自定义一个堆栈类来更好地理解和控制其内部操作。本文将详细介绍如何使用C++实现一个简单的堆栈类。 首先,让我们了解堆栈的基本操作: 1. **...

    BugTrap - C++程序崩溃堆栈信息收集

    "BugTrap"是一个专为C++开发者设计的工具,它能帮助开发者在程序崩溃时捕获并记录详细的堆栈信息,以便于后期分析和修复问题。本文将深入探讨BugTrap的工作原理、使用方法以及它如何提升C++程序的调试效率。 ...

    个人总结--函数堆栈调用

    在编程语言如C++中,函数堆栈调用是一个核心概念,它涉及到程序执行流程、内存管理和函数调用过程。本文将重点讨论函数调用时的堆栈操作,特别是与C++中的空类和默认函数相关的内容。 首先,让我们来看看空类`Empty...

    C-C++堆栈指引

    【应聘笔记系列】堆栈、栈帧与函数调用过程分析,C-C++堆栈指引

    linux函数堆栈操作过程

    堆栈是一种先进后出的数据结构,是计算机中最常用的一种数据结构,堆栈可以用数组 实现,也可以用链表实现。其中,堆(heap)中存放的是用malloc 分配地址的动态变量或 c++中的对象等数据;栈(stack )又称称为堆栈...

    C-C++中堆栈的区别

    在C和C++编程语言中,堆和栈是两种重要的内存区域,它们各自有不同的特点和用途。理解这两者的区别对于优化程序性能和避免内存管理问题至关重要。 首先,栈(Stack)是程序运行时由编译器自动管理的内存区域。栈上...

    C#调用C++动态库,执行回调函数并传递结构体参数

    C++的回调函数需要考虑函数指针的调用约定,通常使用`__stdcall`约定,以确保调用者清理堆栈。 在C#中定义回调函数的委托类型: ```csharp [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate void ...

    堆栈类的实现(C++源代码)

    4. **主函数中的使用**:在`main()`函数中,创建了`Cstack`类的一个实例`s`,并调用`init()`方法初始化堆栈。然后通过`cin`读取用户输入的字符,直到遇到‘#’字符或堆栈满时停止。接着,通过调用`pop()`方法逐个...

    VC中打印当前调用堆栈信息实例

    在Microsoft Visual C++ (VC) 开发环境中,打印当前调用堆栈信息是一个非常有用的调试技巧,它可以帮助开发者追踪程序执行流程,理解函数调用顺序,尤其是在遇到异常或错误时。下面将详细介绍如何在VC中实现这个功能...

    C/C++ 标准库函数 (中文版)

    而C++标准模板库(STL)则提供了一系列可复用的模板类和函数,支持数据结构和算法实现,如双端队列(deque)、优先队列(priority_queue)、列表(list)、映射(map)、多重映射(multimap)、多重集合(multiset)...

    堆栈、栈帧与函数调用过程分析

    【应聘笔记系列】堆栈、栈帧与函数调用过程分析,C-C++堆栈指引

    剖析C++函数调用约定

    C++函数调用约定是编程过程中非常重要的概念,它规定了函数调用时参数传递的顺序、谁负责清理堆栈以及函数名是否需要修饰。在Visual C/C++编译器中,有四种主要的函数调用约定:__cdecl、__stdcall、__fastcall和...

    C++用堆栈储存迷宫,并寻找路径

    ### C++ 使用堆栈储存迷宫并寻找路径 在本篇文档中,我们将详细解析一个使用堆栈数据结构来储存迷宫布局,并寻找从起点到终点路径的C++程序。该程序通过定义堆栈类、节点类以及迷宫类来实现迷宫的存储和路径寻找...

    堆栈数据结构的c++实现

    在计算机科学中,堆栈常用于函数调用、表达式求值、内存管理等多种场景。主要操作包括: 1. 入栈(Push):将元素添加到堆栈的顶部。 2. 出栈(Pop):移除堆栈顶部的元素。 3. 查看顶部元素(Top):不移除地查看...

    通过EBP EIP来找函数调用堆栈

    在提供的"test-a.sln"和"test-a"文件中,很可能是C/C++项目的一个解决方案文件和源代码文件。为了实际操作这个过程,我们需要使用调试器打开这些文件,设置断点,然后单步执行或在异常发生时暂停,查看当时的EBP和...

    数据结构C++语言(进出堆栈动画)

    2. **C++ STL的使用**:使用`<stack>`头文件引入堆栈容器,并了解其成员函数的用法。例如,`push()`函数用于将元素添加到栈顶,`pop()`用于删除栈顶元素,`top()`返回栈顶元素但不删除,`empty()`检查栈是否为空。 ...

    C++/C堆栈知识

    在编程领域,尤其是在C++和C这样的语言中,理解堆栈(Stack)的概念至关重要,因为它们直接影响程序的执行效率和内存管理。堆栈是一种特殊的内存区域,它遵循“后进先出”(LIFO,Last In First Out)原则,常用于...

    C or C++函数递归详解

    本文介绍了C语言中函数递归的概念和应用。函数递归是指一个函数在执行过程中调用自身的过程,可以帮助解决一些复杂的问题,如计算阶乘、斐波那契数列等。文章通过实例代码详细讲解了函数递归的实现方式和注意事项,...

Global site tag (gtag.js) - Google Analytics