C运行时的数据结构
本文描述一下:C运行时的数据结构,相关的段,压栈等
unix默认的编译器会将编译生成的文件默认命名为a.out
目标文件和可执行文件可以有几种不同的格式,所有这些不同格式具有一个共同的概念,那就是段。
这里的段表示一个二进制文件相关的内容块。
用size + 可执行文件名 可以显示这个文件的三个段(文本段,数据段和BSS段)的大小
文本段是用于保存编译后的指令的。
数据段是用于保存初始化的全局和静态变量。
BBS(Block Started by Symbol)由符号开始的块,用于保存没有值的变量,貌似并不需要保存这些变量的映像,BBS段不占据目标文件的任何空间。
如图是相应代码和对应编译后目标文件的段:
#include<stdio.h>
main()
{
printf("hello
world!\n");
}
下面来size一下这段代码编译后的文件:
text表示文本段,data表示数据段,bss表示 BSS段,
dec表示十进制三个段总和,hex是表示十六进制总和。
接下来在上述代码中加入一个全局的int[1000]的数组声明:
#include<stdio.h>
int
a[1000];
main()
{
printf("hello
world!\n");
}
说明声明了一个全局变量数组只增加了bss段,增加了4028。
现在将它初始化
#include<stdio.h>
int
a[1000] = {1};
main()
{
printf("hello
world!\n");
}
发现bss段变回原来的4,数据段增加了4024,这里为什么不是和bss一样增加了4028呢?
int[1000]应该只占用了4000字节,其他的可能是有存一下指针或者段的分割标志之类的吧,具体不是很清楚呀,希望知道的朋友告诉我一下。
在函数内声明一个巨大的数组
#include<stdio.h>
int
a[1000] = {1};
main()
{
printf("hello
world!\n");
int
b[1000000];
}
发现并未变化,现在将其初始化:
#include<stdio.h>
int
a[1000] = {1};
main()
{
printf("hello
world!\n");
int
b[1000000] = {1};
}
发现初始化的局部数组b使得文本段增加了。
数据段是保存在目标文件中的。
BBS段不保存在目标文件中的。
文本段是最容易受优化措施影响的段。
a.out文件的大小受调试状态下编译的影响,但段不受影响。
下面来看开进程的地址空间图:

堆栈段主要有三个用途,其中两个跟函数有关,另一个跟表达式计算有关。
1.堆栈为函数内部声明的局部变量提供储存空间。
2.进行函数调用时,堆栈储存与此有关的一些维护性的信息。
3.堆栈也可以被用作暂时存储区。
堆栈的建立顺序大致为:
参数入栈
返回地址入栈
代码跳转到被调用函数处执行
EBP指针入栈
为局部变量分配地址
通用寄存器入栈
参考:http://www.cnblogs.com/Binhua-Liu/archive/2010/08/24/1803095.html
他这里是vs下编译的,linux下可能有一些不同,具体的还没研究,希望到时再研究一下~
C运行时的数据结构的更多相关文章
- Runtime运行时机制
Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的 我们需要了解的是 Objective-C 是一门动态语言, ...
- C语言运行时数据结构
段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- Objective-C Runtime 运行时之一:类与对象
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- Objective-O Runtime 运行时初体验
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- 探究JVM——运行时数据区
最近在读<深入理解Java虚拟机>,收获颇丰,记录一下,部分内容摘自原书. Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- Runtime运行时的那点事儿
注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...
- iOS开发之runtime运行时机制
最近参加三次面试都有被问到runtime,因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知道理解它对理解OC代码内部变化有一定帮助,不过真心觉得 ...
- MFC六大核心机制之二:运行时类型识别(RTTI)
上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...
随机推荐
- 【PHP设计模式 11_QiaoJie.php】桥接模式(针对 二维模型)
<?php /** * [桥接模式(针对 二维模型)] * 对于多维度需要处理的事情,多耦合 * 第一维度,发送信息的类型:站内信.email.手机短信 * 第二维度,发送信息的紧急程度:普通. ...
- JavaEE基础(十一)/Eclipse介绍
1.Java开发工具(常见开发工具介绍) A:操作系统自带的记事本软件 B:高级记事本软件 C:集成开发环境 IDE (Integrated Development Environment) D:Ec ...
- HDU 4453:Looploop(Splay各种操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4453 题意:很多种操作:1.add x,将从光标起的 k2 个数全部加上 x:2.reverse,将从光标起的 ...
- 6.shap以及selector的使用
功能:相当于自定义一个模板 首先,要新建一个drawble文件夹 然后,再新建一个XML文件 在<shap></shap>中写内容 <corners/>圆角 < ...
- ubuntu12.04下安卓编译环境搭建总结
前言: 因为工作需要,经常要编译安卓下的动态库,公司有已经搭建好环境的服务器,但是第一自己想自己搭建一下了解一个整个过程,另外,公司的服务器也经常出现问 题,导致编译不了,所以就想自己搭建环 ...
- 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)
阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...
- java实现贪吃蛇游戏
最简单的4个java类就可以实现贪吃蛇: main函数: package tcs; public class GreedSnake { public static void main(String[] ...
- A Round Peg in a Ground Hole(凸包应用POJ 1584)
A Round Peg in a Ground Hole Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5684 Accepte ...
- SortedDictionary和SortedList
使用上两者的接口都类似字典,并且SortedList的比如Find,FindIndex,RemoveAll常用方法都没提供. 数据结构上二者差异比较大,SortedList查找数据极快,但添加新元素, ...
- view class source code with JAD plugin in Eclipse
The default class viewer doesn't decompile the class file so you cannot open and check the source co ...