带你玩转Visual Studio
帶你玩轉(zhuǎn)Visual Studio
帶你新建一個工程
工程目錄下各文件的含義
解決方案與工程
在這之前先了解一個概念:解決方案與工程。
解決方案(Solution):一個大型項目的整體的工作環(huán)境;
工程 (Project):一個解決方案下的一個子工程;
在VS中,一個Solution可以有一個或多個Project。在我們創(chuàng)建一個工程時,如果沒有指定Solution,VS會幫我們創(chuàng)建一個與工程名相同的Solution,這時一個Solution里只有一個Project。所有在我們的TestProject的文件目錄結(jié)構(gòu)中TestProject文件夾下還有一個TestProject文件夾(如圖4),第一個就是整個Solution的目錄,第二個才是Project的目錄。
解決方案相關(guān)的文件:
TestProject.sln:
整個解決方案(Solution)的配制文件,組織多個工程和相關(guān)的元素到一個解決方案中。用鼠標(biāo)雙擊它就能用VS打開整個工程項目。
TestProject.sdf:
瀏覽相關(guān)的數(shù)據(jù)庫文件,它支持瀏覽和導(dǎo)航的特性。如跳轉(zhuǎn)到方法、變量的聲明,查找所有對象的所有被引用的地方,類視圖等等。
TestProject.suo:
(solution user opertion) 解決方案用戶選項,記錄所有將與解決方案建立關(guān)聯(lián)的選項, 以便在每次打開時,它都包含您所做的自定義設(shè)置.
TestProject.opensdf:
打開解決方案(Solution)時的臨時文件,這個文件只有你的解決方案在VS打開的狀態(tài)才會有,工程一關(guān)閉文件就被刪除了。
工程相關(guān)的文件
TestProject.vcxproj:
記錄工程(Project)相關(guān)的屬性配制。
TestProject.vcxproj.filters:
文件過慮器,上圖3“工程結(jié)構(gòu)”中各個文件的組織和編排都是定義在這個文件中的。如果由于某種特殊的原因(如系統(tǒng)或VS突然崩潰)導(dǎo)致你打開工程時文件的組織結(jié)構(gòu)是亂的,100%就是這個文件的原因。
TestProject.vcxproj.user:
用戶相關(guān)的一些配制。
上面這些文件中有幾個比較重要的一定不能刪的文件是:
TestProject.sln、TestProject.vcxproj、TestProject.vcxproj.filters
不要問我是怎樣知道這些文件的作用的,請看官方文檔:
VS2010定義:https://msdn.microsoft.com/en-us/library/3awe4781.aspx.
VS2015定義:https://msdn.microsoft.com/en-us/library/vstudio/hx0cxhaw(v=vs.110).aspx
帶你了解VC++各種類型的工程
理解幾個概念
COM
COM(Component Object Model)組件對象模型是microsoft制定的一個組件軟件標(biāo)準(zhǔn),跟unix上的CORBA一樣。凡是遵循COM標(biāo)準(zhǔn)開發(fā)出來的組件稱為COM組件。目地是實現(xiàn)二進(jìn)制方式的軟件重用 。在windows平臺上,COM的實現(xiàn)形式有DLL(進(jìn)程內(nèi)組件)和EXE(進(jìn)程外組件)2種。
OLE
OLE(Object Linking and Embedding)對象連接與嵌入是微軟的復(fù)合文檔技術(shù),可方便實現(xiàn)應(yīng)用程序之間的通信。在后來的OLE2中才導(dǎo)入了 COM,提供了對COM的支持,利用這種技術(shù)可開發(fā)可重復(fù)使用的軟件組件COM。OLE是軟件比較早提出的一種技術(shù)。
ATL
ATL(Active Template Library)活動模板庫是一套C++模板庫,常用于開發(fā)COM程序和ActiveX程序。要理解ATL技術(shù)可從以下兩方面理解:
在ATL產(chǎn)生以前,開發(fā)COM組件的方法主要有兩種:一是使用COM SDK(COM軟件開發(fā)包)直接開發(fā)COM組件,另一種方式是通過MFC提供的COM支持來實現(xiàn)。而現(xiàn)在 ATL已經(jīng)成為Microsoft支持COM應(yīng)用開發(fā)的主要開發(fā)工具。
MFC
MFC(Microsoft Foundation Classes)微軟基礎(chǔ)類是微軟提供的一個用于Windows程序開發(fā)的基礎(chǔ)類庫。MFC以C++類的形式封裝了Windows的API,并且包含一個應(yīng)用程序框架,以減少應(yīng)用程序開發(fā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組件的封裝類。
ActiveX
ActiveX是微軟提出的一組使用COM技術(shù)使得軟件組件在網(wǎng)絡(luò)環(huán)境中進(jìn)行交互的技術(shù)集,它與具體的編程語言無關(guān)。作為針對Internet應(yīng)用開發(fā)的技術(shù),ActiveX被廣泛應(yīng)用于WEB服務(wù)器以及客戶端的各個方面。同時,ActiveX技術(shù)也被用于方便地創(chuàng)建普通的桌面應(yīng)用程序,此外ActiveX一般具有界面。
ActiveX既包含服務(wù)器端技術(shù),也包含客戶端技術(shù)。其主要內(nèi)容是:
帶你高效開發(fā)
使用Visual Assist X
Visual Assist X Snippets 宏
Visual Assist X Snippets 宏
帶你高效管理代碼
目前主流的版本控制系統(tǒng)有:
C++工程上傳服務(wù)器要忽視的文件
C++工程上傳服務(wù)器要忽視的文件
h: 頭文件 cpp: 源文件 txt: 說明文件,如readme rc: 資源文件 rc2: 資源文件 ico: 圖標(biāo),如logo等 sln: 解決方案工程文件 vcxproj: 工程文件 filters: 文件過慮器不要上傳的文件類型
Debug、Release等編譯結(jié)構(gòu)目錄 ipch目錄 aps: last resource editor state exe: build result idb: build state ipch: build helper lastbuildstate: build helper lib: build result. Can be 3rd party log: build log manifest: build helper. Can be written yourself. obj: build helper pch: build helper pdb: build result res: build helper sdf: intellisense dbase suo: solution user options tlog: build log user: debug settings. Do preserve if just one dev or custom debug settings如果用TortoiseSVN進(jìn)行管理,需要手動添加ignore屬性將不需要上傳的文件忽略掉。在你工程目錄里,右鍵->TortoiseSVN->Properties->New->Other,彈出的對話框中Property name中選擇svn:ignore,Property value中填入要忽略的內(nèi)容(這里可以使用能配符)。可以設(shè)置全局忽略樣式。
帶你跳出坑爹的Runtime Library坑
Multi-threaded /MT Release版的多線程靜態(tài)庫 libcmt.lib Multi-threaded Debug /MTd Debug版的多線程靜態(tài)庫 libcmtd.lib Multi-threaded DLL /MD Release版的多線程動態(tài)庫 msvcrt.lib+msvcrtxx.dll Multi-threaded DLL Debug MDd Debug版的多線程動態(tài)庫 msvcrtd.lib+msvcrtxxd.dll結(jié)論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要采用了。
帶你理解多字節(jié)編碼與Unicode碼
incremental linking(增量鏈接)的作用
VS中的路徑宏 vc++中OutDir、ProjectDir、SolutionDir各種路徑
命令行編譯C/C++程序
打開安裝目錄下的VSDIR\VC\bin可以看到一系列的可執(zhí)行程序.exe和批處理文件,這些就是VS2010構(gòu)建、編譯、鏈接時要用到的工具。看一下幾個主要的工具:
cl.exe:編譯程序 link.exe:鏈接程序 lib.exe:加載lib庫的程序 nmake.exe:用makefile進(jìn)行構(gòu)建、編譯的工具微軟 CL.exe 編譯器
##性能分析與優(yōu)化##
使用VS的性能分析工具
性能分析工具的選擇
打開一個“性能分析”的會話:Debug->Start Diagnotic Tools Without Debugging(或按Alt+F2),VS2013在Analysis菜單中。
CPU Usage
檢測CPU的性能,主要用于發(fā)現(xiàn)影響CPU瓶頸(消耗大量CPU資源)的代碼。
GPU Usage
檢測GPU的性能,常用于圖形引擎的應(yīng)用(如DirectX程序),主要用于判斷是CPU還是GPU的瓶頸。
Memory Usage
檢測應(yīng)用程序的內(nèi)存,發(fā)現(xiàn)內(nèi)存。
Performance Wizard
性能(監(jiān)測)向?qū)?#xff0c;綜合檢測程序的性能瓶頸。這個比較常用,下面再逐一說明。
性能(監(jiān)測)向?qū)?/h3>
CPU Sampling(CPU采樣):
進(jìn)行采樣統(tǒng)計,以低開銷水平監(jiān)視占用大量CPU的應(yīng)用程序。這個對于計算量大的程序可大大節(jié)省監(jiān)控時間。
Instrumentation(檢測):
完全統(tǒng)計,測量函數(shù)調(diào)用計數(shù)和用時
.NET memory allocation(.NET 內(nèi)存分配):
跟蹤托管內(nèi)存分配。這個好像只有托管代碼(如C#)才可用,一般以C++代碼好像不行。
Resource contention data(并發(fā)):
檢測等待其他線程的線程,多用于多線程的并發(fā)。
性能分析報告
視圖類型
有幾個不同的視圖可供我們切換,下面加粗的部分是個人覺得比較方便和常用的視圖。
- Summary(概要):整個報告概要說明
- Call Tree(調(diào)用樹):以樹形表格的方式展開函數(shù)之間的關(guān)系。
- Module(模塊):分析調(diào)用的不同的程序模塊,如不同的DLL、lib模塊的耗時
- Caller/Callee(調(diào)用與被調(diào)用):以數(shù)值顯示的調(diào)用與被調(diào)用的關(guān)系
- Functions(函數(shù)統(tǒng)計):以數(shù)值顯示的各個函數(shù)的執(zhí)行時間和執(zhí)行次數(shù)統(tǒng)計值
- Marks(標(biāo)記):
- Processers(進(jìn)程):
- Function Detials(函數(shù)詳情):以圖表的方式形象地顯示:調(diào)用函數(shù)-當(dāng)前函數(shù)-被調(diào)用子函數(shù)之間的關(guān)系和時間比例。
專用術(shù)語
- Num of Calls:(函數(shù))調(diào)用次數(shù)
- Elapsed Inclusive Time:已用非獨占時間
- Elapsed Exclusive Time:已用獨占時間
- Avg Elapsed Inclusive Time:平均已用非獨占時間
- Avg Elapsed Exclusive Time:平均已用獨占時間
- Module Name:模塊名稱,一般為可執(zhí)行文件(.exe)、動態(tài)庫(.dll)、靜態(tài)庫(.lib)的名稱。
調(diào)用約定__cdecl、__stdcall和__fastcall
什么是調(diào)用約定
函數(shù)的調(diào)用約定,顧名思義就是對函數(shù)調(diào)用的一個約束和規(guī)定(規(guī)范),描述了函數(shù)參數(shù)是怎么傳遞和由誰清除堆棧的。它決定以下內(nèi)容:(1)函數(shù)參數(shù)的壓棧順序,(2)由調(diào)用者還是被調(diào)用者把參數(shù)彈出棧,(3)以及產(chǎn)生函數(shù)修飾名的方法。
常見的調(diào)用約定有__cdecl、__stdcall、fastcall,應(yīng)用最廣泛的是__cdecl和__stdcall,下面我們會詳細(xì)進(jìn)行講述。。還有一些不常見的,如 __pascal、__thiscall、__vectorcall。
__cdecl的特點
__cdecl 是 C Declaration 的縮寫,表示 C 和 C++ 默認(rèn)的函數(shù)調(diào)用約定。是C/C++和MFCX的默認(rèn)調(diào)用約定。
- 按從右至左的順序壓參數(shù)入棧、。
- 由調(diào)用者把參數(shù)彈出棧。切記:對于傳送參數(shù)的內(nèi)存棧是由調(diào)用者來維護(hù)的,返回值在EAX中。因此對于像printf這樣可變參數(shù)的函數(shù)必須用這種約定。
- 編譯器在編譯的時候?qū)@種調(diào)用規(guī)則的函數(shù)生成修飾名的時候,在輸出函數(shù)名前加上一個下劃線前綴,格式為_function。如函數(shù)int add(int a, int b)的修飾名是_add。
__stdcall的特點
__stdcall是Standard Call的縮寫,是C++的標(biāo)準(zhǔn)調(diào)用方式,當(dāng)然這是微軟定義的標(biāo)準(zhǔn),__stdcall通常用于Win32 API中(可查看WINAPI的定義)。
- 按從右至左的順序壓參數(shù)入棧。
- 由被調(diào)用者把參數(shù)彈出棧。切記:函數(shù)自己在退出時清空堆棧,返回值在EAX中。
- __stdcall調(diào)用約定在輸出函數(shù)名前加上一個下劃線前綴,后面加上一個“@”符號和其參數(shù)的字節(jié)數(shù),格式為_function@number。如函數(shù)int sub(int a, int b)的修飾名是_sub@8。
__fastcall的特點
__fastcall調(diào)用的主要特點就是快,因為它是通過寄存器來傳送參數(shù)的。
- 實際上__fastcall用ECX和EDX傳送前兩個DWORD或更小的參數(shù),剩下的參數(shù)仍自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的內(nèi)存棧。
- __fastcall調(diào)用約定在輸出函數(shù)名前加上一個“@”符號,后面也是一個“@”符號和其參數(shù)的字節(jié)數(shù),格式為@function@number,如double multi(double a, double b)的修飾名是@multi@16。
- __fastcall和__stdcall很象,唯一差別就是頭兩個參數(shù)通過寄存器傳送。注意通過寄存器傳送的兩個參數(shù)是從左向右的,即第1個參數(shù)進(jìn)ECX,第2個進(jìn)EDX,其他參數(shù)是從右向左的入棧,返回仍然通過EAX。
__thiscall
__thiscall是C++類成員函數(shù)缺省的調(diào)用約定,但它沒有顯示的聲明形式。因為在C++類中,成員函數(shù)調(diào)用還有一個this指針參數(shù),因此必須特殊處理,thiscall調(diào)用約定的特點:
- 參數(shù)入棧:參數(shù)從右向左入棧
- this指針入棧:如果參數(shù)個數(shù)確定,this指針通過ecx傳遞給被調(diào)用者;如果參數(shù)個數(shù)不確定,this指針在所有參數(shù)壓棧后被壓入棧。
- 棧恢復(fù):對參數(shù)個數(shù)不定的,調(diào)用者清理棧,否則函數(shù)自己清理棧。
調(diào)用約定與(動態(tài))庫
調(diào)用約定與(動態(tài))庫
參考:
- 帶你玩轉(zhuǎn)Visual Studio
總結(jié)
以上是生活随笔為你收集整理的带你玩转Visual Studio的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云技术方案简述
- 下一篇: MIP影视模板泛站程序万能模板