日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

何谓CRT,CRT的由来

發(fā)布時間:2024/1/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 何谓CRT,CRT的由来 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CRT:C Run-Time Library, C 語言運行時庫。

由來:

  • 1) 運行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程序運行時需要這些庫中的函數(shù).
  • 2) C 語言是所謂的“小內(nèi)核”語言,就其語言本身來說很小(不多的關(guān)鍵字,程序流程控制,數(shù)據(jù)類型等);所以,C 語言內(nèi)核開發(fā)出來之后,Dennis Ritchie 和 Brian Kernighan 就用 C 本身重寫了 90% 以上的 UNIX 系統(tǒng)函數(shù),并且把其中最常用的部分獨立出來,形成頭文件和對應(yīng)的 LIBRARY,C run-time library 就是這樣形成的。
  • 3) 隨后,隨著 C 語言的流行,各個 C 編譯器的生產(chǎn)商/個體/團體都遵循老的傳統(tǒng),在不同平臺上都有相對應(yīng)的 Standard Library,但大部分實現(xiàn)都是與各個平臺有關(guān)的。由于各個 C 編譯器對 C 的支持和理解有很多分歧和微妙的差別,所以就有了 ANSI C;ANSI C (主觀意圖上)詳細的規(guī)定了 C 語言各個要素的具體含義和編譯器實現(xiàn)要求,引進了新的函數(shù)聲明方式,同時訂立了 Standard Library 的標(biāo)準(zhǔn)形式。所以C運行時庫由編譯器生產(chǎn)商提供。至于由其他廠商/個人/團體提供的頭文件和庫函數(shù),應(yīng)當(dāng)稱為第三方 C 運行庫(Third party C run-time libraries)。
  • 4) C run-time library里面含有初始化代碼,還有錯誤處理代碼(例如divide by zero處理)。你寫的程序可以沒有math庫,程序照樣運行,只是不能處理復(fù)雜的數(shù)學(xué)運算,不過如果沒有了C run-time庫,main()就不會被調(diào)用,exit()也不能被響應(yīng)。因為C run-time library包含了C程序運行的最基本和最常用的函數(shù)。
  • 5) 到了 C++ 世界里,有另外一個概念:Standard C++ Library,它包括了上面所說的 C run-time library 和 STL。包含 C run-time library 的原因很明顯,C++ 是 C 的超集,沒有理由再重新來一個 C++ run-time library. VC針對C++ 加入的Standard C++ Library主要包括:LIBCP.LIB, LIBCPMT.LIB和 MSVCPRT.LIB
  • 6) Windows環(huán)境下,VC提供的 C run-time library又分為動態(tài)運行時庫和靜態(tài)運行時庫。 動態(tài)運行時庫主要是DLL庫文件msvcrt.dll(or MSVCRTD.DLL for debug build),對應(yīng)的Import library文件是MSVCRT.LIB(MSVCRTD.LIB for debug build) 靜態(tài)運行時庫(release版)對應(yīng)的主要文件是: LIBC.LIB (Single thread static library, retail version) LIBCMT.LIB (Multithread static library, retail version) msvcrt.dll提供幾千個C函數(shù),即使是像printf這么低級的函數(shù)都在msvcrt.dll里。其實你的程序運行時,很大一部分時間時在這些運行庫里運行。在你的程序(release版)被編譯時,VC會根據(jù)你的編譯選項(單線程、多線程或DLL)自動將相應(yīng)的運行時庫文件(libc.lib,libcmt.lib或Import library msvcrt.lib)鏈接進來。 編譯時到底哪個C run-time library聯(lián)入你的程序取決于編譯選項: /MD, /ML, /MT, /LD (Use Run-Time Library) 你可以VC中通過以下方法設(shè)置選擇哪個C run-time library聯(lián)入你的程序
  • 從程序可移植性考慮,如果兩函數(shù)都可完成一種功能,選運行時庫函數(shù)好,因為各個 C 編譯器的生產(chǎn)商對標(biāo)準(zhǔn)C Run-time library提供了統(tǒng)一的支持.
轉(zhuǎn)帖自:(http://zhidao.baidu.com/question/75691336.html?si=1)typedef int (__cdecl * _CRT_ALLOC_HOOK)(int, void *, size_t, int, long, const unsigned char *, int);_CRT_ALLOC_HOOK _CrtSetAllocHook( _CRT_ALLOC_HOOK allocHook );參數(shù):allocHook 監(jiān)聽 C Run-time debug 時候內(nèi)存申請釋放的鉤子函數(shù) . 返回值: 返回先前設(shè)置的鉤子函數(shù),如果沒有設(shè)置過,就返回NULL 設(shè)置鉤子后,在C Run-time中進行內(nèi)存的 allocate, reallocate 以及 free 操作前都會觸發(fā)鉤子函數(shù) 上述鉤子函數(shù)只有在定義了_DEBUG的時候才生效. 自定義的鉤子函數(shù)如下: int user_allocHook(int allocType, void* userData, size_t size, int blockType, long requestNumber, const unsigned char* filename, int lineNumber); // 返回TRUE 示意繼續(xù)分配,返回FALSE 示意分配器拒絕當(dāng)前操作,操作失敗 參數(shù): allocType 內(nèi)存操作類型, (_HOOK_ALLOC, _HOOK_REALLOC, and _HOOK_FREE) userData 內(nèi)存操作數(shù)據(jù),當(dāng)操作類型為 _HOOK_ALLOC 時, userData為空 size 當(dāng)前操作的內(nèi)存block的大小 blockType 當(dāng)前操作的內(nèi)存block的類型 (_FREE_BLOCK, _NORMAL_BLOCK, _CRT_BLOCK, _IGNORE_BLOCK, _CLIENT_BLOCK, _MAX_BLOCKS) requestNumber 當(dāng)前操作需要的順序請求編號 filename 當(dāng)前操作所在源代碼的文件名 lineNumber 當(dāng)前操作所在源代碼的行數(shù) 備注: _Check_return_ _CRTIMP size_t __cdecl _msize(_In_ void * _Memory); 翻譯自(MSDN http://msdn.microsoft.com/zh-cn/library/820k4tb8(VS.90).aspx)

轉(zhuǎn)載于:https://www.cnblogs.com/JefferyZhou/archive/2012/09/24/2700312.html

總結(jié)

以上是生活随笔為你收集整理的何谓CRT,CRT的由来的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。