找回密码
 注册
搜索
查看: 1052|回复: 0

[讨论] 嵌入式C基础——认识函数堆栈(必懂)

[复制链接]
发表于 2012-6-3 09:12:51 | 显示全部楼层 |阅读模式
我们都知道函数调用必须通过堆栈来完成,但是许多学员对堆栈的具体工作原理不很情况,因此产生了许多担心,下面里仁嵌入式培训讲师把课堂讲解知识在详解一遍:

   函数堆栈实际上使用的是程序的堆栈内存空间,虽然程序的堆栈段是系统为程序分配的一种静态数据区,但是函数堆栈却是在调用到它的时候才动态分配的。

   也就是说,你不能在编译时就为函数分配好一块静态空间作为堆栈。一是因为无法在编译时确定一个函数运行时所需的堆栈大小;二是因为函数在调用完后如果还为它保留堆栈空间就会浪费内存,一个软件系统中成千上万的函数就会耗尽内存了。例如想知道一个复合对象的各个成员在内存是如何排列的,先声明的成员在高地址区还是低地址区,或者class的各个访问区段的成员之间是如何排列的。下面我们设计测试程序。注意:这种测试的结果可能是平台相关的。

#include

#include

Using namespace std;

Class TestArrange

{

Public:

    Long m_lng;

    Char m_ch1;

   TestArrange() //constructor

{

   m_lng=0;

   m_ch1=’a’;

   m_int=0;

   m_ch2=’a’;

}

  Const int* GeIntAddr(){return&m_int;}

  Const char* GecharAddr(){return&m_ch2;}

Private:

  Int m_int;

  Char m_ch2;

}

Int main(void)

{

  testArrange test;

   cout<<”Address of test object:”<<&test<

   cout<< endl;

   cout<<”Address of m_Ing:”<<&(test.m_lng)<

  printf(”Address of m_ch1:%p\n”,&(test.m_ch1))

cout<<”Address of m_int:”<

cout<<”Address of m_ch2:”<<(void*)test.GetChar2Addr()<

return 0;

}



Address of object:0012FF70

Address of m_lng:0012FF70

Address of m_ch1:0012FF74

Address of m_int:0012FF78

Address of m_ch2:0012FF7C

   在c语言得格式话I/O中,常使用%p来输出内存地址值;而在C++中,除了字符串的地址无法直接输出外,其他类型对象的地址都可以使用“&”输出。可以采用通用方法:把任何类型的地址或者指针强制转换成void*就可以输出了。包括字符串的指针。

   堆栈是自动管理的,也就是说局部变量的创建和销毁、堆栈的释放都是函数自动完成的,不需要程序的干涉。局部变量在程序执行流动达到它的定义的时候创建,在退出其所在程序的地方销毁,堆栈在函数退出的时候清退(还给程序堆栈段),显然,由于函数堆栈在预先分配好的内存空间上创建,不需要运行时的搜索,因此比动态内存分配速度快而且安全。这是堆栈和堆和自己存储空间的区别所在。

  函数堆栈主要有3个用途:在进入函数前保存环境变量和返回地址,在进入函数时保存实参的拷贝,在函数体内保存局部变量。

转载注:http://www.lirenedu.org/index.php?ack=xinwen&id=1026
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-24 02:18 , Processed in 0.043250 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表