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
總結
以上是生活随笔為你收集整理的C/C++运行库简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC中为对话框添加背景图片
- 下一篇: 基本图形的光栅化算法