什么是c/c++运行时库

在各个版本的编译器中,我们可以通过配置选项来设置程序使用的C和C++运行时库的类型。如下图(其他版本编译器大同小异):

MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码,程序体积会变大。
MTd选项:LIB的调试版。
MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行。
MDd选项:表示使用DLL的调试版。

关于C和C++运行库的概念
  为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C库函数。C标准仅仅定义了函数原型,并没有提供实现。因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run Time Library),简称CRT。对于VC++编译器来说,它提供的CRT库支持C标准定义的标准C函数,同时也有一些专门针对Windows系统特别设计的函数
  与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库或C++标准库。由于C++对C的兼容性,C++标准库包括了C标准库,除此之外还包括了IO流和标准模板库STL。

VC++在何处实现C和C++运行库
  VC++完美的支持C和C++标准,因此也就按照C和C++标准定义的函数原型实现了上述运行时库。为了方便有不同需求的客户使用,VC++分别实现了动态链接库DLL版本和静态链接库LIB版本。同时为了支持程序调试且不影响程序的性能,又分别提供了对应的调试版本。调试版本的名称在Release版本名称后添加了字母d。

对于C运行时库CRT,VC6.0、VC2005、VC2008和VC2010均提供了DLL版本和LIB版本。
上述各个编译器提供的LIB版的CRT库,均实现在libcmt.lib。对应的调试版名称为libcmtd.lib。

而DLL版本名称根据编译器不同而不同,我们可以从名称上加以分辨。
  VC6.使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.LIB。
  VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL。
  VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL。
  VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL。
  VC2013使用的CRT库的DLL版本在MSVCR120.DLL中实现,对应调试版本为MSVCR120D.DLL。
对于C++标准库中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。
  LIB版均实现在libcpmt.lib中,对应的调试版本为libcpmtd.lib。
不同版本的编译器实现的DLL也不相同。
  VC6.使用的C++类库的 DLL版本在MSVCP60.DLL中实现, 对应调试版本为MSVCP60D.LIB。
  VC2005使用的C++类库的DLL版本在MSVCP80.DLL中实现,对应调试版本为MSVCP80.DLL。
  VC2008使用的C++类库的 DLL版本在MSVCP90.DLL中实现,对应调试版本为MSVCP90D.DLL。
  VC2010使用的C++类库的DLL版本在MSVCP100.DLL中实现,对应调试版本为MSVCP100D.DLL。

动态版(DLL)和静态版(LIB)C和C++运行库的优缺点
  因为静态版必须把C和C++运行库复制到目标程序中(.exe),所以产生的可执行文件会比较大。同时对于使用多个模块的大型软件来说,如果每个模块均选择静态链接C或C++运行库,在程序运行时就会存在多个运行库。在链接时也会出现重复定义的问题.
  使用DLL版的C和C++运行库,程序在运行时动态的加载对应的DLL。程序体积变小,但一个很大的问题就是一旦找不到对应DLL,程序将无法运行(比如所要移植的电脑没有安装VC++)。假设使用VC6.0并选择使用MD选项构建,那么当用户使用VC2005来使用这个DLL时很可能出现找不到MSVCRT.DLL或MSVCP60.DLL的情况。

1

用_beginthreadex()函数应该是最佳选择,因为_beginthreadex()函数是CRun-timeLibrary中的函数,函数的参数和数据类型都是CRun-timeLibrary中的类型,这样在启动线程时就不需要进行Windows数据类型和CRun-timeLibrary中的数据类型之间的转化。减低了线程启动时的资源消耗和时间的消耗!

C运行库_beginthreadex()。他经过一些处理后,再调用CreateThread()如果要强制结束的话也最好用_endthreadex结束,因为他也要一些处理。 总结上面的内容,当然《Windows核心编程》上面得说法是比较权威的。所以,在对线程的结构、运行还不是很了解的时候最好还是按照书上的来。这样能够避免一些可能出现的莫名奇妙的错误,也省去的一些其他结构处理的考虑。当你清楚地知道线程的结构与运行机制,以及了解各个函数对CreateThread函数的封装的时候,大概那时候就能够应用自如了。

首先,需要说明的是这三个函数都与CreateThread函数有关系。CreateThread函数是Windows的一个API函数,其具体的使用方法在 MSDN和《Windows核心编程》上都有详细介绍。主要的作用是创建一个线程。_beginthreadex函数是C/C++运行库提供的函数,从 _beginthreadex函数的源代码,可以看出它的主要动作是:增加了一个名为ptd的_ptiddata的结构的处理,然后在调用CreateThread函数。_ptiddata是每个线程都拥有自己的专用的数据结构。关于使用CreateThread代替_beginthreadex的结果以及可能出现的问题在《Windows核心编程》上讲的很清楚: “也许你想知道,如果调用CreateThread,而不是调用C/C++运行期库的_beginthreadex来创建新线程,将会发生什么情况。当一个线程调用要求_ptiddata结构的C / C + +运行期库函数时,将会发生下面的一些情况(大多数C / C + +运行期库函数都是线程安全函数,不需要该结构)。

什么是c/c++运行时库相关推荐

  1. crt 运行时库dll跨模块传递crt对象,出现的崩溃问题

    参考链接: https://blog.csdn.net/weixin_30653097/article/details/96512399 (讲述了,运行时库在启动的时候在exe或dll入口点之前就使用 ...

  2. 如何在VS2005下生成动态运行时库

    如果我们的工程采用的是动态链接MFC库,那我们的程序如果拷贝到一个没有转VC的电脑中,我们的程序要想正确运行,除了拷贝程序外,还要将运行时库拷贝过去,下面记录下如何创建动态运行时库: file-> ...

  3. C++堆被破坏 运行时库

    每个进程都有一个默认堆,在进程初始化的时候会创建这个默认堆,可以通过GetProcessHeap()获取默认堆的句柄.使用CRT时,也会有一个CRT堆,VS项目属性 ~ C/C++ ~ 代码生成 ~ ...

  4. 近距离端详Android ART运行时库

    Table of Contents 在最新的Google I/O大会上,Google 发布了关于Android上最新的运行时库的情况.这就是Android RunTime (ART). ART 将会取 ...

  5. linux安装gcc运行时库,Linux安装gcc-6.1.0

    获取gcc源码包 # wget https://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2 # tar -jxvf gcc-6.1.0.tar.bz ...

  6. visual studio运行时库MT、MTd、MD、MDd 的区别

    msdn上面的解释: MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库 MTd:mutithread+debug,多线程 ...

  7. CRT(C Runtime Library)—— C/C++运行时库

    C runtime library(part of the C standard library) 任何一个 C 程序,它的背后都有一套庞大的代码来进行支撑,使得该程序得以运行在更高级别上,而不必担心 ...

  8. linux安装gcc运行时库,现在可以在CentOS 8系统下用命令安装GCC 8.3.1版本

    如果你需要在CentOS 8系统下安装GCC 8,则只需要运行相关的命令就可以了,现在安装的版本是GCC 8.3.1.如果你需要编译安装GCC源码包,则本文不适合你阅读,本文就介绍安装GCC最简单的方 ...

  9. c++ 判断电脑是否装有vc_redist.x86 运行时库

    Windows把卸载信息保存在注册表键HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall之下.我们可以枚举这个 ...

最新文章

  1. Consumer接口练习之按要求打印信息
  2. 大剑无锋之分布式和微服务分别是什么?【面试推荐】
  3. MFC线程创建运行关闭的问题
  4. Python程序互斥体
  5. 社会工程学***的八种常用方法
  6. S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
  7. linux改狗命令,linux安装安全狗
  8. 现场活动画面组织控制及抽奖的使用疑难问题汇编
  9. C# WinForm开发
  10. “ 流量or变现 “ 网销50条干货必备
  11. 人物志-丘吉尔 Success consists of going from failure to failure without loss of enthusiasm. —— Winston Chu
  12. 小提琴统计图_小提琴图解读 - 统计学
  13. 【QT】linux下alsa库的移植和QT中音视频的处理笔记
  14. 基于stm32和ESP8266实现wifi模块smartlink功能以及TCP连接
  15. 从0到1 拿下C语言——绪论(计算机的组成、进制转换、算法表示、程序结构、C语言基本词汇)
  16. linux下用户和组的管理,linux用户和组管理常见命令
  17. 鸿蒙——通用设计基础(未完待续)
  18. DP地狱训练 挤牛奶
  19. 3dmax:3dmax经典案例详细步骤图文教程之镜头效果制作黄昏中打开的灯
  20. 隐式差分格式matlab,二维热传导方程隐式差分格式系数矩阵特征值的求取

热门文章

  1. 机器学习实现简单人脸识别
  2. 电脑中必备的一款软件——得力数据恢复软件
  3. 求100以内的奇数和偶数的和
  4. QA:IMEI号申请、什么是IMEI号、怎么申请IMEI、IMEI作用
  5. sql 获取上级 上上级
  6. Python开源项目总结
  7. linux redis退出命令行,linux的redis启动关闭命令
  8. 漫谈云计算网络(一):云计算网络技术介绍
  9. 投资组合优化的人工蜂群算法(Matlab代码实现)
  10. 微信跳一跳作弊python脚本,非常简单