C语言文件联系人管理碎片整理,深入理解C语言内存管理.docx
深入理解C语言内存管理
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。
问题不能拖,我这就来学习一下吧,争取一次搞定。?在任何程序设计环境及语言中,内存管理都十分重要。
内存管理的基本概念
分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c
1 #include
2 #include
3 int var1 = 1;
4
5 int main(void) {
6 int var2 = 2;
7 printf("hello, world!\n");
8 exit(0);
9 }
经过gcc hello.c进行编译之后得到了名为a.out的可执行文件
[tuhooo@localhost leet_code]$?ls -al a.out-rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out
ls命令是查看文件的元数据信息
[tuhooo@localhost leet_code]$?file a.outa.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=23c58f2cad39d8b15b91f0cc8129055833372afe, not stripped
file命令用来识别文件类型,也可用来辨别一些文件的编码格式。
它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。
[tuhooo@localhost leet_code]$?size a.out
text?
data
bss
dec
hex
filename
(代码区静态数据)
(全局初始化静态数据)
(未初始化数据区)?
(十进制总和)
(十六制总和)
(文件名)
1301
560
8
1869
74d
a.out
显示一个目标文件或者链接库文件中的目标文件的各个段的大小,当没有输入文件名时,默认为a.out。
size:支持的目标: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core。
那啥,可执行文件在存储(也就是还没有载入到内存中)的时候,分为:代码区、数据区和未初始化数据区3个部分。
进一步解读
(1)代码区(text segment)。存放CPU执行的机器指令(machine instructions)。通常,代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
(2)全局初始化数据区/静态数据区(initialized data segment/data segment)。该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。例如,一个不在任何函数内的声明(全局数据):
1 int maxcount = 99;
使得变量maxcount根据其初始值被存储到初始化数据区中。
1 static mincount = 100;?
这声明了一个静态数据,如果是在任何函数体外声明,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。另外,如果在函数名前加上static,则表示此函数只能在当前文件中被调用。
(3)未初始化数据区。亦称BSS区(uninitialized data segment),存入的是全局未初始化变量。BSS这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始。BSS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。例如一个不在任何函数内的声明:
1 long sum[1000];
将变量sum存储到未初始化数据区。
下图所示为可执行代码存储时结构和运行时结构的对照图。一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。
?
再来看一张图,多个一个命令行参数区:
(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),
C语言文件联系人管理碎片整理,深入理解C语言内存管理.docx相关推荐
- 万字整理,肝翻Linux内存管理所有知识点【Linux内核开发人员必学】都是精髓
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...
- multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局-理论篇
苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...
- Spark 内存管理详解(下):内存管理
本文转自:Spark内存管理详解(下)--内存管理 本文最初由IBM developerWorks中国网站发表,其链接为Apache Spark内存管理详解 在这里,正文内容分为上下两篇来阐述,这是下 ...
- multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局及管理方案理论篇
苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...
- Linux内存管理:一个故事看懂CPU内存管理技术
目录 8086 32位时代 虚拟内存 分页交换 现在 往期热门回顾 推荐阅读 还记得我吗,我是阿Q,CPU一号车间的那个阿Q. 今天忙里偷闲,来到厂里地址翻译部门转转,负责这项工作的小黑正忙得满头大汗 ...
- 万字整理,肝翻Linux内存管理所有知识点
Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...
- arm的linux怎么管理任务,【linux】arm mm内存管理
欢迎转载,转载时请保留作者信息,谢谢. arm mmu硬件原理 由上图,arm分四种模式,section,大小页+ 极小页, section模式简单,也能说明mmu本质,其它模式只是用了多级数组索引 ...
- python内存管理错误的是_关于Python内存管理,下列说法错误的是
53 Python中变量可以不指定类型,会自动根据赋值语句来决定类型 同时,使用前必须赋值,在赋值的同时变量也就创建了 发表于 2018-02-28 22:50:02 回复(0) 61 本题答案选 B ...
- (转载)深入理解Linux中内存管理---分段与分页简介
首先,必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术. 来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个 ...
最新文章
- java override 访问权限_java 重写(Override)的规则
- css鼠标悬停样式_利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标
- 剑指Offer--青蛙跳台阶引发的一系列问题
- html文本框整数范围,验证HTML表单文本框中的数值范围。 PHP或Javascript
- learnpython3thehardway视频_LearnPython3theHardWay__Excercise 13 Parameters, Unpacking, Variables
- twisted系列教程十六–twisted守护进程
- 【报告分享】中国移动互联网2021年度大报告.pdf(附下载链接)
- 当代计算机技术在建筑设备中的应用,计算机技术在建筑设计中应用浅谈.doc
- ​BAT 等 34 家企业签署合规经营承诺书;美团被判赔偿饿了么 35.2 万元;FreeBSD 13.0 发布|极客头条...
- 自学python编程笔记本推荐-这件神器,每个 Python入门学习者都值得一试
- App Domains and dynamic loading
- [互联网思维(转)]互联网思维法则
- 多功能小游戏神器微信小程序源码
- 网络流量在线分析系统的设计与实现
- vue 循环播放音乐列表 音量控制
- 交换机路由器常用命令大全
- Linux运维技术之Linux云计算架构
- adb 安卓模拟器 进程端口_Android模拟器端口被占用问题的解决办法
- 自动备份电脑文件至云盘的操作,你会吗?
- nth_element用法