您的位置:首页 > 理论基础 > 数据结构算法

运行时数据结构

2015-05-29 15:59 441 查看
1、a.out

是”assembler output(汇编程序输出)”的缩写形式。

它不是汇编程序输出,而是链接器输出。

2、段

目标文件和可执行文件可以有几种不同的格式。在绝大多数SVr4实现中都采用了一种称作ELF(”Extensible Linker Format,可扩展链接器格式”、现在代表”Executable and Linking Format,可执行文件和链接格式”)的格式。section 是ELF文件中的最小组织单位。一个段(segment)一般包含几个section。

• 在UNIX中,段表示一个二进制文件相关的内容块。

• 在Intel x86的内存模型中,段表示一种设计的结果。在这种设计中,地址空间并非一个整体,而是分成一些64K大小的区域,称之为段。

3、auto和static关键字

对堆栈怎样实现函数调用的描述也同时解释了为什么不能从函数中返回一个指向该函数局部自动变量的指针,eg:

char * favorite_fruit() {
char deciduous[] = "apple";
Return deciduous;
}


当进入该函数时,自动变量deciduous在堆栈中分配。当函数结束后,变量不复存在,它所占用的堆栈空间被回收,可能在任何时候覆盖。这样,指针就失去了有效性,被称为"悬垂指针(dangling pointer)"--它们并不引用有用的东西,而是悬在地址空间内。如果想返回一个指向在函数内部定义的变量的指针时,要把那个变量声明为static。这样就能保证该变量被保存在数据段中而不是堆栈中。该变量的生命期就和程序一样长,当定义该变量的函数退出时,该变量的值依然能保持。

auto是存储类型说明符关键字。通常由编译器设计者使用,用于标记符号表的条目--它表示“在进入该块后,自动分配存储”(与编译时静态分配或在堆上动态分配不同)。


4、setjmp和longjmp

它们通过操纵过程活动记录。弥补了C语言有限的转移能力。两个函数协同工作:

• setjmp(jmp_buf j)必须首先被调用。表示“使用变量j记录现在的位置。函数返回零。”
• longjmp(jmp_buf j ,int i)可以接着被调用。表示“回到j所记录的位置,让它看上去像是从原先的setjmp()函数返回一样。但是函数返回 i,使代码能够知道它是实际上是通过longjmp()返回的。”
• 当使用于longjmp()时,j的内容被销毁。
Setjmp保存了一份程序的计数器和当前的栈顶指针。如果喜欢也可以保存一些初始值,longjmp恢复这些值,有效的转移控制并把状态重置回保存状态的时候。这被称作“展开堆栈”,因为你从堆栈中展开过程活动记录,直到取得保存在其中的值。尽管longjmp会转移,但它又和goto又有不同,区别如下:
• goto语句不能跳出C语言当前的函数(这也是longjmp取名的由来,它可以跳的更远,甚至可以跳到其他文件的函数中)。
• 用longjmp只能跳回到曾经到过的地方。在执行setjmp的地方仍留有一个过程活动记录。从这个角度讲,longjmp更像是“从何处来”而不是“到何处去”。longjmp接受一个额外的整型参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然而然来到这里的。
Eg:


#include<setjmp.h>
jmp_buf buf;
#include<setjmp.h>
banana(){
printf("in banana() \n");
longjmp(buf,1);
//以下代码不会被执行到
printf("you'll never see this,because i longjmp'd");
}

main(){
if(setjmp(buf))
printf("back in main\n");
else{
printf("first time through\n");
banana();
}
}


setjmp和longjmp在c++中变异为更普通的异常处理机制"catch"和"throw"。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: