帶你玩轉Visual Studio

帶你玩轉Visual Studio

帶你新建一個工程

工程目錄下各文件的含義

解決方案與工程

在這以前先了解一個概念:解決方案與工程。
解決方案(Solution):一個大型項目的總體的工做環境;
工程 (Project):一個解決方案下的一個子工程;html

在VS中,一個Solution能夠有一個或多個Project。在咱們建立一個工程時,若是沒有指定Solution,VS會幫咱們建立一個與工程名相同的Solution,這時一個Solution裏只有一個Project。全部在咱們的TestProject的文件目錄結構中TestProject文件夾下還有一個TestProject文件夾(如圖4),第一個就是整個Solution的目錄,第二個纔是Project的目錄。c++

解決方案相關的文件:

TestProject.sln:
整個解決方案(Solution)的配製文件,組織多個工程和相關的元素到一個解決方案中。用鼠標雙擊它就能用VS打開整個工程項目。git

TestProject.sdf:
瀏覽相關的數據庫文件,它支持瀏覽和導航的特性。如跳轉到方法、變量的聲明,查找全部對象的全部被引用的地方,類視圖等等。github

TestProject.suo:
(solution user opertion) 解決方案用戶選項,記錄全部將與解決方案創建關聯的選項, 以便在每次打開時,它都包含您所作的自定義設置.數據庫

TestProject.opensdf:
打開解決方案(Solution)時的臨時文件,這個文件只有你的解決方案在VS打開的狀態纔會有,工程一關閉文件就被刪除了。編程

工程相關的文件

TestProject.vcxproj:
記錄工程(Project)相關的屬性配製。windows

TestProject.vcxproj.filters:
文件過慮器,上圖3「工程結構」中各個文件的組織和編排都是定義在這個文件中的。若是因爲某種特殊的緣由(如系統或VS忽然崩潰)致使你打開工程時文件的組織結構是亂的,100%就是這個文件的緣由。服務器

TestProject.vcxproj.user:
用戶相關的一些配製。網絡

上面這些文件中有幾個比較重要的必定不能刪的文件是:多線程

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制定的一個組件軟件標準,跟unix上的CORBA同樣。凡是遵循COM標準開發出來的組件稱爲COM組件。目地是實現二進制方式的軟件重用 。在windows平臺上,COM的實現形式有DLL(進程內組件)和EXE(進程外組件)2種。

OLE

OLE(Object Linking and Embedding)對象鏈接與嵌入是微軟的複合文檔技術,可方便實現應用程序之間的通訊。在後來的OLE2中才導入了 COM,提供了對COM的支持,利用這種技術可開發可重複使用的軟件組件COM。OLE是軟件比較早提出的一種技術。

ATL

ATL(Active Template Library)活動模板庫是一套C++模板庫,經常使用於開發COM程序和ActiveX程序。要理解ATL技術可從如下兩方面理解:

  1. ATL能夠說是把COM封裝了一下,象MFC同樣作成一個庫,並有一個嚮導,使COM應用開發儘量地自動化、可視化,這就決定了ATL只面向COM開發提供支持。
  2. ATL因其採用了特定的基本實現技術,擺脫了大量冗餘代碼,使用ATL開發出來的COM應用的代碼簡練高效。
    在ATL產生之前,開發COM組件的方法主要有兩種:一是使用COM SDK(COM軟件開發包)直接開發COM組件,另外一種方式是經過MFC提供的COM支持來實現。而如今 ATL已經成爲Microsoft支持COM應用開發的主要開發工具。

    MFC

MFC(Microsoft Foundation Classes)微軟基礎類是微軟提供的一個用於Windows程序開發的基礎類庫。MFC以C++類的形式封裝了Windows的API,而且包含一個應用程序框架,以減小應用程序開發人員的工做量。其中包含的類包含大量Windows句柄封裝類和不少Windows的內建控件和組件的封裝類。

ActiveX

ActiveX是微軟提出的一組使用COM技術使得軟件組件在網絡環境中進行交互的技術集,它與具體的編程語言無關。做爲針對Internet應用開發的技術,ActiveX被普遍應用於WEB服務器以及客戶端的各個方面。同時,ActiveX技術也被用於方便地建立普通的桌面應用程序,此外ActiveX通常具備界面。

ActiveX既包含服務器端技術,也包含客戶端技術。其主要內容是:

  1. ActiveX控制(ActiveX Control);用於向WEB頁面、Microsoft Word等支持ActiveX的容器(Container)中插入COM對象。
  2. ActiveX文檔(ActiveX Document);用於在WEB Browser或者其它支持ActiveX的容器中瀏覽複合文檔(非HTML文檔),例如Microsoft Word文檔,Microsoft Excel文檔或者用戶自定義的文檔等。
  3. ActiveX腳本描述(ActiveX Scripting);用於從客戶端或者服務器端操縱ActiveX控制和Java程序,傳遞數據,協調它們之間的操做。
  4. ActiveX服務器框架(ActiveX Server Framework);提供了一系列針對WEB服務器應用程序設計各個方面的函數及其封裝類,諸如服務器過濾器、HTML數據流控制等。
  5. 在Internet Explorer中內置Java虛擬機(Java Virtual Machine),從而使Java Applet可以在Internet Explorer上運行,並能夠與ActiveX控制經過腳本描述語言進行通訊。

帶你高效開發

使用Visual Assist X

Visual Assist X Snippets 宏

Visual Assist X Snippets 宏

帶你高效管理代碼

目前主流的版本控制系統有:

  1. CVS:是一個用於代碼版本控制的自由軟件,它是一個比較早出現的工具,因爲它有不少自身的缺陷,如今幾乎被SVN所取代了。
  2. SVN:SVN是Subversion的簡稱,它是集中式的版本控制系統。SVN繼承了CVS的基本思想,包含了CVS的幾乎全部功能。你能夠認爲SVN是CVS的升級版(但實際上它們徹底是兩個軟件)。
  3. GIT:GIT是分佈式的版本控制系統。相信玩過開源代碼的都知道github吧,它就是一個基於git的代碼託管平臺

C++工程上傳服務器要忽視的文件

C++工程上傳服務器要忽視的文件

h: 頭文件
cpp: 源文件
txt: 說明文件,如readme
rc: 資源文件
rc2: 資源文件
ico: 圖標,如logo等
sln: 解決方案工程文件
vcxproj: 工程文件
filters: 文件過慮器

不要上傳的文件類型

Debug、Release等編譯結構目錄
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進行管理,須要手動添加ignore屬性將不須要上傳的文件忽略掉。在你工程目錄裏,右鍵->TortoiseSVN->Properties->New->Other,彈出的對話框中Property name中選擇svn:ignore,Property value中填入要忽略的內容(這裏可使用能配符)。能夠設置全局忽略樣式。

帶你跳出坑爹的Runtime Library坑

Multi-threaded  /MT     Release版的多線程靜態庫     libcmt.lib  
Multi-threaded Debug    /MTd    Debug版的多線程靜態庫   libcmtd.lib     
Multi-threaded DLL  /MD     Release版的多線程動態庫     msvcrt.lib+msvcrtxx.dll     
Multi-threaded DLL Debug    MDd     Debug版的多線程動態庫   msvcrtd.lib+msvcrtxxd.dll

結論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要採用了。

帶你理解多字節編碼與Unicode碼

  1. 當設置爲Use Unicode Character Set時,會有預編譯宏:_UNICODE、UNICODE
  2. 當設置爲Use Unicode Character Set時,會有預編譯宏:_UNICODE、UNICODE

incremental linking(增量連接)的做用

VS中的路徑宏 vc++中OutDir、ProjectDir、SolutionDir各類路徑

命令行編譯C/C++程序

打開安裝目錄下的VSDIR\VC\bin能夠看到一系列的可執行程序.exe和批處理文件,這些就是VS2010構建、編譯、連接時要用到的工具。看一下幾個主要的工具:

cl.exe:編譯程序
link.exe:連接程序
lib.exe:加載lib庫的程序
nmake.exe:用makefile進行構建、編譯的工具

微軟 CL.exe 編譯器

性能分析與優化

使用VS的性能分析工具

性能分析工具的選擇

打開一個「性能分析」的會話:Debug->Start Diagnotic Tools Without Debugging(或按Alt+F2),VS2013在Analysis菜單中。

CPU Usage

檢測CPU的性能,主要用於發現影響CPU瓶頸(消耗大量CPU資源)的代碼。

GPU Usage

檢測GPU的性能,經常使用於圖形引擎的應用(如DirectX程序),主要用於判斷是CPU仍是GPU的瓶頸。

Memory Usage

檢測應用程序的內存,發現內存。

Performance Wizard

性能(監測)嚮導,綜合檢測程序的性能瓶頸。這個比較經常使用,下面再逐一說明。

性能(監測)嚮導

CPU Sampling(CPU採樣):

進行採樣統計,以低開銷水平監視佔用大量CPU的應用程序。這個對於計算量大的程序可大大節省監控時間。

Instrumentation(檢測):

徹底統計,測量函數調用計數和用時

.NET memory allocation(.NET 內存分配):

跟蹤託管內存分配。這個好像只有託管代碼(如C#)纔可用,通常以C++代碼好像不行。

Resource contention data(併發):

檢測等待其餘線程的線程,多用於多線程的併發。

性能分析報告

視圖類型

有幾個不一樣的視圖可供咱們切換,下面加粗的部分是我的以爲比較方便和經常使用的視圖。

  • Summary(概要):整個報告概要說明
  • Call Tree(調用樹):以樹形表格的方式展開函數之間的關係。
  • Module(模塊):分析調用的不一樣的程序模塊,如不一樣的DLL、lib模塊的耗時
  • Caller/Callee(調用與被調用):以數值顯示的調用與被調用的關係
  • Functions(函數統計):以數值顯示的各個函數的執行時間和執行次數統計值
  • Marks(標記):
  • Processers(進程):
  • Function Detials(函數詳情):以圖表的方式形象地顯示:調用函數-當前函數-被調用子函數之間的關係和時間比例。

專用術語

  • Num of Calls:(函數)調用次數
  • Elapsed Inclusive Time:已用非獨佔時間
  • Elapsed Exclusive Time:已用獨佔時間
  • Avg Elapsed Inclusive Time:平均已用非獨佔時間
  • Avg Elapsed Exclusive Time:平均已用獨佔時間
  • Module Name:模塊名稱,通常爲可執行文件(.exe)、動態庫(.dll)、靜態庫(.lib)的名稱。

調用約定__cdecl、__stdcall和__fastcall ##

什麼是調用約定

函數的調用約定,顧名思義就是對函數調用的一個約束和規定(規範),描述了函數參數是怎麼傳遞和由誰清除堆棧的。它決定如下內容:(1)函數參數的壓棧順序,(2)由調用者仍是被調用者把參數彈出棧,(3)以及產生函數修飾名的方法。

常見的調用約定有__cdecl、__stdcall、fastcall,應用最普遍的是__cdecl和__stdcall,下面咱們會詳細進行講述。。還有一些不常見的,如 __pascal、__thiscall、__vectorcall。

__cdecl的特色 ###

__cdecl 是 C Declaration 的縮寫,表示 C 和 C++ 默認的函數調用約定。是C/C++和MFCX的默認調用約定。

  • 按從右至左的順序壓參數入棧、。
  • 由調用者把參數彈出棧。切記:對於傳送參數的內存棧是由調用者來維護的,返回值在EAX中。所以對於像printf這樣可變參數的函數必須用這種約定。
  • 編譯器在編譯的時候對這種調用規則的函數生成修飾名的時候,在輸出函數名前加上一個下劃線前綴,格式爲_function。如函數int add(int a, int b)的修飾名是_add。

__stdcall的特色 ###

__stdcall是Standard Call的縮寫,是C++的標準調用方式,固然這是微軟定義的標準,__stdcall一般用於Win32 API中(可查看WINAPI的定義)。

  • 按從右至左的順序壓參數入棧。
  • 由被調用者把參數彈出棧。切記:函數本身在退出時清空堆棧,返回值在EAX中。
  • __stdcall調用約定在輸出函數名前加上一個下劃線前綴,後面加上一個「@」符號和其參數的字節數,格式爲_function@number。如函數int sub(int a, int b)的修飾名是_sub@8。

__fastcall的特色 ###

__fastcall調用的主要特色就是快,由於它是經過寄存器來傳送參數的。

  • 實際上__fastcall用ECX和EDX傳送前兩個DWORD或更小的參數,剩下的參數仍自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧。
  • __fastcall調用約定在輸出函數名前加上一個「@」符號,後面也是一個「@」符號和其參數的字節數,格式爲@function@number,如double multi(double a, double b)的修飾名是@multi@16。
  • __fastcall和__stdcall很象,惟一差異就是頭兩個參數經過寄存器傳送。注意經過寄存器傳送的兩個參數是從左向右的,即第1個參數進ECX,第2個進EDX,其餘參數是從右向左的入棧,返回仍然經過EAX。

__thiscall ###

__thiscall是C++類成員函數缺省的調用約定,但它沒有顯示的聲明形式。由於在C++類中,成員函數調用還有一個this指針參數,所以必須特殊處理,thiscall調用約定的特色:

  • 參數入棧:參數從右向左入棧
  • this指針入棧:若是參數個數肯定,this指針經過ecx傳遞給被調用者;若是參數個數不肯定,this指針在全部參數壓棧後被壓入棧。
  • 棧恢復:對參數個數不定的,調用者清理棧,不然函數本身清理棧。

調用約定與(動態)庫

調用約定與(動態)庫

參考:

相關文章
相關標籤/搜索