c/c++的内存布局
来源:互联网 发布:plc的编程语言有哪些 编辑:程序博客网 时间:2024/06/03 12:28
说明一点:这仅是从抽象的语言层次上的谈论,只是一种建议标准,所以在具体编程实践时,具体布局还要看编译器本身。
先认识一下源文件到可执行文件的标准过程:
源文件经过以下几步生成可执行文件:
- 1、预处理(preprocessor):对#include、#define、#ifdef/#endif、#ifndef/#endif等进行处理
- 2、编译(compiler):将源码编译为汇编代码
- 3、汇编(assembler):将汇编代码汇编为目标代码
- 4、链接(linker):将目标代码链接为可执行文件
编译器和汇编器创建的目标文件包含:二进制代码(指令)、源码中的数据;链接器将多个目标文件链接成一个;装载器吧目标文件加载到内存。
图1 源文件到可执行文件的步骤
可执行程序组成及内存布局
典型的可执行文件分为两部分:
- 代码段(Code),由机器指令组成,该部分是不可改的,编译之后就不再改变,放置在文本段(.text)。
- 数据段(Data),它由以下几部分组:
- 常量(constant),通常放置在只读read-only的文本段(.text)
- 静态数据(static data),初始化的放置在数据段(.data);未初始化的放置在(.bss,Block Started by Symbol,BSS段的变量只有名称和大小却没有值)
- 动态数据(dynamic data),这些数据存储在堆(heap)或栈(stack)
源程序编译后链接到一个以0地址为始地址的线性或多维虚拟地址空间。而且每个进程都拥有这样一个空间,每个指令和数据都在这个虚拟地址空间拥有确定的地址,把这个地址称为虚拟地址(Virtual Address)。将进程中的目标代码、数据等的虚拟地址组成的虚拟空间称为虚拟存储器(Virtual Memory)。典型的虚拟存储器中有类似的布局:
- Text Segment (.text)
- Initialized Data Segment (.data)
- Uninitialized Data Segment (.bss)
- The Stack
- The Heap
如下图所示:
图2 进程内存布局
当进程被创建时,内核为其提供一块物理内存,将虚拟内存映射到物理内存,这些都是由操作系统来做的。
那么一个变量,到底放在哪个地方
这与变量的具体类型有关,实际上一个变量在内存中的一个位置,解析这个变量时,依赖于这个变量的2个属性:存储类型和数据类型
C/C++中由(auto、 extern、 register、 static)存储类别和变量声明的上下文决定它的存储类别。数据类型都知道,忽略不谈
1、自动变量
auto和register将声明的变量指定为自动存储类别。他们的作用域是局部的,诸如一个函数内,一个代码块{***}内等。操作了作用域,变量会被销毁。
- 在一个代码块中声明一个变量,如果没有执行auto,那么默认是自动存储类别。
- 声明为register的变量是自动存储类别,存储在计算机的快速寄存器中。不可以对register变量做取值操作“&”。
2、静态变量
静态变量可以局部的,也可以是全局的。静态变量一直保持它的值,例如进入一个函数,函数中的静态变量仍保持上次调用时的值。包含静态变量的函数不是线程安全的、不可重入的,正是因为它具有“记忆”功能。
- 局部变量声明为静态之后,将改变它在内存中保存的位置,由动态数据--->静态数据,即从堆或栈变为数据段或bbs段。
- 全局变量声明为静态之后,而不会改变它在内存中保存的位置,仍然是在数据段或bbs段。但是static将改变它的作用域,即该变量仅在本源文件有效。此相反的关键字是extern,使用extern修饰或者什么都不带的全局变量的作用域是整个程序。
- C的内存布局
- c/c++的内存布局
- C程序的内存布局
- C/C++的内存布局
- C程序代码的内存布局
- C/C++的内存布局
- C语言的内存布局
- C代码的内存布局
- C程序的内存布局
- c程序内存布局
- C/C++ 内存布局
- Objective-C内存布局
- C/C++ 内存布局
- Objective-C内存布局
- Objective-C内存布局
- C - 内存布局
- C语言内存布局
- C语言内存布局
- api读取注册表
- Google App Engine上传和显示图片
- 我原来如此
- 网络传输——Base64详解
- Sql Server 新建实例
- c/c++的内存布局
- Kettle 4.2 使用文件资源库
- Single sign-on,什么是单点登陆?
- 流年轻弹、离殇一曲
- Java项目实战中文转换类
- 最简洁的最大公约数算法
- Java项目实战文件上传类
- Project Euler #1
- 尕福(散文)