From 36699b4f3456592c5c3cd2709c8f90b6caf8d25d Mon Sep 17 00:00:00 2001 From: huihut Date: Tue, 13 Feb 2018 19:31:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BF=90=E8=A1=8C=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 53cd42c..b60011d 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ * extern"C" * const作用 * 什么是面向对象(OOP) -* new和malloc的区别 +* new、malloc、alloca的区别 * 运行时类型识别(RTTI) * 友元类和友元函数 * struct和class的区别 @@ -136,6 +136,65 @@ ## 链接装载库 +### 运行库(Runtime Library) + +#### 典型程序运行步骤 + +1. 操作系统创建进程,把控制权交给程序的入口(往往是运行库中的某个入口函数) +2. 入口函数对运行库和程序运行环境进行初始化(包括堆、I/O、线程、全局变量构造等等)。 +3. 入口函数初始化后,调用main函数,正式开始执行程序主体部分。 +4. main函数执行完毕后,返回到入口函数进行清理工作(包括全局变量析构、堆销毁、关闭I/O等),然后进行系统调用结束进程。 + +> 一个程序的I/O指代程序与外界的交互,包括文件、管程、网络、命令行、信号等。更广义地讲,I/O指代操作系统理解为“文件”的事物。 + +#### glibc 入口 + +`_start -> __libc_start_main -> exit -> _exit` + +其中`main(argc, argv, __environ)`函数在`__libc_start_main`里执行。 + +#### MSVC CRT 入口 + +`int mainCRTStartup(void)` + +执行如下操作: + +1. 初始化和OS版本有关的全局变量。 +2. 初始化堆。 +3. 初始化I/O。 +4. 获取命令行参数和环境变量。 +5. 初始化C库的一些数据。 +6. 调用main并记录返回值。 +7. 检查错误并将main的返回值返回。 + +#### C语言运行库(CRT) + +一个C语言运行库大致包含如下功能: + +* 启动与退出:包括入口函数及入口函数所依赖的其他函数等。 +* 标准函数:有C语言标准规定的C语言标准库所拥有的函数实现。 +* I/O:I/O功能的封装和实现。 +* 堆:堆的封装和实现。 +* 语言实现:语言中一些特殊功能的实现。 +* 调试:实现调试功能的代码。 + +#### C语言标准库(ANSI C) + +包含: + +* 标准输入输出(stdio.h) +* 文件操作(stdio.h) +* 字符操作(ctype.h) +* 字符串操作(string.h) +* 数学函数(math.h) +* 资源管理(stdlib.h) +* 格式转换(stdlib.h) +* 时间/日期(time.h) +* 断言(assert.h) +* 各种类型上的常数(limits.h & float.h) +* 变长参数(stdarg.h) +* 非局部跳转(setjmp.h) + ## 海量数据处理 * [ 海量数据处理面试题集锦](http://blog.csdn.net/v_july_v/article/details/6685962)