程序员的自我修养 8.8分
读书笔记 MSVC CRT入口函数
超级露

MSVC CRT入口函数

Microsoft Visual Studio 2003

MSVC的CRT默认的入口函数名为mainCRTStartup,总体流程为:

1. 初始化和OS版本有关的全局变量

2. 初始化堆

3. 初始化I/O

4. 获取命令行参数和环境变量

5. 初始化C库的一些数据

6. 调用main并记录返回值

7. 检查错误并将main的返回值返回

1. msvc的入口函数使用了alloca,它是如何实现的?

alloca函数的特点是它能够动态地在栈上分配内存,在函数退出时如同局部变量一样自动释放。结合之前介绍的函数标准进入和退出指令序列就知道,函数退出时的退栈操作时直接将ESP的值赋给EBP的值。因此不管在函数的执行过程中ESP减少了多少,最后也能够成功地将函数执行时分配的所有栈空间回收。在这个基础上,alloca的实现就非常简单,仅仅是将ESP减少一定数值而已。

2. 为什么MSVC的Win32程序的入口使用的是WinMain?

WinMain和main一样,都不是程序的实际入口。MSVC的程序入口是同一段代码,但根据不同的编译参数被编译成了不同的版本。不同版本的入口函数在其中会调用不同名字的函数,包括main/wmain/WinMain/wWinMain等。

0
《程序员的自我修养》的全部笔记 280篇
豆瓣
我们的精神角落
免费下载 iOS / Android 版客户端