多线程MT加载的是静态运行时库,属于C语言版本;而多线程MD版本加载是动态运行时库,属于微软版本。在工程属性窗体中选择配置属性,C++选项的代码生成多线程调试 DLL (/MDd)和多线程调试 DLL (/MTd)是Debug版本,后面没有d的是Release版本。

一、全局堆句柄不一样。

网上有一个说法,就是一个线程一个栈,一个模块一个堆。前者很容易有理解,每个线程创建的时候在CreateThread中都能制定默认栈大小,只是很多情况下都取了默认值。而一个模块一个堆呢?其实很简单测试,如果是一个多线程MT编译方式的程序,你写一个dll,导出一个函数,参数设置为vector<int>,然后在exe中调用,当导出函数结束时就会崩溃掉。其实原因很简单,就是因为初始化向量空间时malloc内存的过程在exe中,而vector析构时会free内存,申请和释放的模块不一致而违背了一个模块一个堆的说法。

细心者会发现,其实不管是new/delete还是malloc/free最终调用的都是HeapAlloc/HeapFree,而这个函数的第一个参数为一个全局的堆句柄,由CreateHeap创建,创建该全局堆句柄的尚且在main等系列主函数之前。事实上这种夸模块堆操作异常总结起来就是申请内存时HeapAlloc传入的句柄和释放该内存时HeapFree传入的句柄不一致引起的,读者可写代码测试。

但是以上问题如果是多线程MD编译方式下便可解决,也就是说如果都是通过多线程MD编译方式出来的程序,如果是A模块中申请的内存到B模块中释放不会出现问题。

二、链接的运行时库不同。

对于多线程MT的程序来说,其连接的是libcmt.lib,该文件属于C语言运行时库,整个lib都会连接到PE文件当中。而多线程MD的程序链接的却是类似msvcpXXX.dll,该文件属于微软运行时库.也就是说如果是多线程MD编译出来的文件运行时都会加载相应版本的运行时库,当如果找不到运行时库就会报错而无法运行,同时如果运行时库不匹配也会出现各种意料之外的崩溃或者程序根本跑不起来等情况。

三、编译出来的PE文件大小区别

此时如果两者作为对比就会很明显看到多线程MT编译出来的文件体积要比多线程MD编译出来的大,因为MT是把对应的运行时库直接放到编译出来的PE文件当中,而MD却是运行的时候从第三方dll中获取运行时库,自己本身却不包含。同时另外的区别也很明显,多线程MT编译出来的文件运行时不需要加载第三方dll所以运行效率要比多线程MD稍微高一点点,当然作为用户是完全感觉不到的。所以说如果打开一个程序目录,发现里面有类似msvcrtXX.dll,那么这个程序几乎可以肯定是用多线程MD方式编译的。

四、总结说明

大多数软件都是采用多线程MD方式编译,例如QQ迅雷等等,如果找到他们目录很容易发现上面提到的运行时库。因为这样一来编译出来的文件小,所有运行时库统一,同时也让内存管理简单化,省去了跨模块内存访问带来的各种bug。

多线程MT和多线程MD的区别相关推荐

  1. 详解多线程MT和多线程MD的区别

    区别1:全局堆句柄不一样. 网上有一个说法,就是一个线程一个栈,一个模块一个堆.前者很容易有理解,每个线程创建的时候在CreateThread中都能制定默认栈大小,只是很多情况下都取了默认值.而一个模 ...

  2. mysql.lib 是mtd mdd_VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别

    程序运行时出现问题,选择的是Release,win64位的模式,并且已经看到了宏定义NDEBUG,但是程序依然进入上面的部分 解决方案是将属性->C/C++->代码生成器->运行库里 ...

  3. 转载 关于多线程MT和MD的区别。

    这段时间司在招实习生,而不管是远程的电话面试或者是实际现场面试中领导都喜欢问你这个问题,但是可惜的是能很好答上来的人很少.后来发现不管是应届的实习生,甚至有些实际参加工作几年的人也未必真的了解这个问题 ...

  4. 关于多线程MT和MD的区别。

    /MD./MT的选择       1.为什么选择/MD,不选/MT?          (1)程序就不需要静态链接运行时库,可以减小软件的大小:          (2)所有的模块都采用/MD,使用的 ...

  5. 详解多线程MT 和 MD

    今天看到一篇帖子,对此方面解释的不错,再此记录一下: 区别1:全局堆句柄不一样. 网上有一个说法,就是一个线程一个栈,一个模块一个堆.前者很容易有理解,每个线程创建的时候在CreateThread中都 ...

  6. VS配置选项MT和MD的区别

    目录 /MD./MT的选择 区别1:全局堆句柄不一样 区别2:链接的运行时库不同 区别3:编译出来的PE文件大小区别 visual studio运行时库MT.MTd.MD.MDd的研究 /MD./MT ...

  7. 简单了解线程和进程、多进程和多线程、并发和并行的区别

    一:线程与进程 1.概念 线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位. 进程:是资源分配的基本单位.一个进程包括多个线程. 2.区别: 1.线程与资源分配无关,它属 ...

  8. 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD

    一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...

  9. 多线程一,什么是多线程,创建多线程的几种方式

    文章目录 1 多线程相关概念 2 多线程概念 3 多线程优缺点 4 多线程实现方式 5 实现runnable和callable的区别 6 继承thread和实现runnable接口的区别 7 多线程匿 ...

最新文章

  1. IBM公布Kitura 1.0和Bluemix Runtime for Swift 3
  2. c语言 输入若干字符串 用指针和一位数组 冒泡排序,C 语言作业 - 1 - 指针使用与冒泡排序...
  3. ADN中国队参加微软Kinect他赢得了全国比赛三等奖,我们的创意项目与团队Kinect于Naviswork虚拟之旅...
  4. 51单片机点亮第一个LED教程
  5. Andorid之jni里面崩溃然后用errno分析结果解决问题
  6. VS中C++ 项目重命名
  7. 程序员的10个神秘等式
  8. 再问数据中台 - 企业数据中台的团队如何构建?绩效如何评价?
  9. Swagger如何测试Date类型参数
  10. python模拟足球_使用K-Means算法划分亚洲国家的三个足球梯队
  11. jdk动态代理的实现流程(事务处理)
  12. scRNA-seq Course 学习
  13. 一部火了20年的音乐剧,到底有何魅力?
  14. 消息中间件----ActiveMQ
  15. 开发者企业公司 邓白氏公司 D-U-N-S Number
  16. 水哥王昱珩的教育语录:输不丢人,怕输才丢人
  17. python和c++情侣网名_python与C或者C++的混合编程
  18. pytest告警信息的处理方法
  19. 【测试】用Chrome在电脑上模拟微信浏览器
  20. 牛客网——MySQL数据库练习

热门文章

  1. 颜色用于检测:肤色检测
  2. 微软推超融合基础架构解决方案 企业可在本地端做虚拟化应用
  3. AD(altium designer)15原理图与PCB设计教程(三)—— 原理图元器件库的管理
  4. VCM绕线机的功能参数
  5. 小程序源码:最新掌上题库微信小程序源码下载,修复登录接口,支持在线考试,自定义导入考题-多玩法安装简单
  6. 关于光盘刻录,重洗的一些知识
  7. 【博客420】arp代理与arp代答
  8. 飞机电子式模拟空速表的设计与制作
  9. 计算机网络:网络应用服务
  10. linux sed 替换中文,Linux中使用sed命令替换字符串小结