当前位置:   article > 正文

C/C++运行库简介

c++运行库

什么是C/C++运行库
任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。另外包括各种标准库函数的实现。
这样的一个代码集合称之为运行时库(Runtime Library),C 语言的运行时库,称为 C 运行库(CRT)。
C 运行库大致包含的功能:
1. 启动与退出函数
2. 由C 语言标准规定的C 语言标准库所拥有的函数实现。
3. I/O 功能的封装与实现。
4. 堆的封装和实现
5. 语言中一些特殊功能的实现。
6. 实现调试功能的代码。

运行库是平台相关的,C 语言的运行库从某种程度上说是C 语言的程序和不同操作系统平台之间的抽象层,将不同的操作系统API 抽象成了相同的库函数。但是C 运行库的功能毕竟有限,比如创建线程等操作,不同的操作系统完全不同。我们不得不通过其它的方法,绕过C 语言运行库直接调用操作系统API 或使用其它的库。Linux 和 Windows 平台下两个主要C 语言的运行库分别为glibc 和 MSVCRT。像线程操作这样的功能,虽然不是标准C 语言运行库的一部分,也现在两个库中,因此glibc 和 MSVCRT 事实上是标准C 语言运行库的超集。
每个编译器通常实现了标准C的超集,称为C运行时库(C Run-Time Library)。
C run-time Library包含了C程序运行的最基本和最常用的函数,没有C run-time Library则main()函数不会被调用,exit()也不能被响应。C运行库与平台相关。

到了C++的世界,有了另外一个概念:Standard C++ Library。因为C++是C的超集,所以Standard C++ Library包括了C run-time Library和STL。
VC++针对C++ 加入的Standard C++ Library主要包括:libcp.lib、libcpmt.lib、msvcprt.lib。

在windows环境下,VC++提供的C Run-Time Library又分为动态运行时库和静态运行时库。
动态运行时库主要是DLL库文件msvcrt.dll(vc 6.0,之后是msvcr100.dll等),静态运行时库对应的主要文件是libc.lib(Single thread static library, retail version) 、LIBCMT.LIB (Multithread static library, retail version) 。msvcrt.dll运行时库提供几千个C函数,包括printf,程序运行时很大部分时间都是在这些运行库中。到底使用哪些库取决于你的编译器及编译选项:/MT、/MTd、/MD、/MDd。
在这里插入图片描述

/MT、/MTd、/MD、/MDd各选项区别
1. MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库(LIBCMT.LIB、LIBC.LIB)集成到程序中,程序体积会变大。
2. MTd选项:LIB的调试版。
3. MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行(需添加MSVCPxx.DLL、MSVCRxx.DLL)。
4. MDd选项:表示使用DLL的调试版。

CRT 为支持多线程所做的改进
1. 使用TLS,TLS 即线程局部存储,多线程环境下,设置错误代码时将值设置到TLS 中,以免引起混乱。
2. 加锁,线程不安全的函数内部自动加锁,包括malloc printf 等。
3. 改进函数调用方式,比如strtok 函数内部实现使用了一个char* 类型的静态局部变量,新版本将添加一个char* 指针参数,替代原来的静态局部变量的功能,但同时,使用此函数的源代码需要进行相应的修改。

运行库职责的主要流程:
1.初始化和操作系统版本有关的全局变量
2.初始化堆
3.初始化I/O
4.获取命令行参数和环境变量
5.初始化C库的一些数据
6.调用mian并记录返回值
7.检查错误并将main的返回值返回

在《win32多线程程序设计》中强调:
如果主线程以外的任何线程进行以下操作,你就应该使用多线程版的 runtime library,并使用 beginthreadex0和
endthreadex
1. 在C程序中使用 malloco和free或是在C程序中使用new和 delete,
2. 调用 stdio.h或io.h中声明的任何函数,包括像 fopen、open、getchar、 write、 printfo等等。所有这些函数都用到共享的数据结构以及 errno你可以使用 wsprintf将字符串格式化,如此就不需要 stdio了,如果链接器抱怨说它找不到 wsprintf你得链接USR32.lib
3. 使用浮点变量或浮点运算函数
4. 调用任何一个使用了静态缓冲区的 runtime函数,如 asctime, strtok或 rand

参考:https://blog.csdn.net/qq_18218335/article/details/74784587
https://blog.csdn.net/lwwl12/article/details/77045717

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/467077
推荐阅读
相关标签
  

闽ICP备14008679号