2011年3月18日

[筆記][2011/03/10] 微軟 C++ 開發日活動

難得有機會可以聽到王老師講課,所以這次有去參加這個活動
C++ 開發日 活用 Visual Studio 2010 - 效能及開發速度全面提升

當然,對我個人來說,確實有不少收穫
目前還沒有看到官方放出的投影片,有些東西回想不起來 T_T
以下是整理的筆記:



* 假如需要批次編譯或是不倚賴 IDE 編譯,可以使用 MSBuild 加上參數來做
另外很有錢的人,也可以安裝 TFS 等軟體,在伺服器設定 Daily Build

* IDE 有提供架構總管以及效能分析等功能(但是 Professional版本沒有)
架構總管可以產生各種圖表(Diagram),來幫助分析專案與元件之間的關聯性
同時,還可以做一些簡單的層級規範,避免與偵測是否有人的類別超過了規範
內建支援五種基本的 UML 也是可以加減使用 ...
效能分析可以透過側面錄製與量測,找出真正的效能瓶頸,而不用自己撰寫測試碼

(實際上自己實驗時,有些東西測出不來,可能是我還不夠熟吧 ...
希望不是又遇到只支援 Managed Code的窘境)

* 使用 SafeInt Library 可以讓數值運算更為安全,避免計算溢位可能造成的錯誤
當然,得犧牲"一點"效能...
#include <safeint.h>

* 一些編譯選項筆記:
Buffer-Overflow Check (/GS)
ImageExceptionProcess (/SAFESEH)
DataExcute (/NXCOMPAT)
Build with Analyze (/analyze)
隨機編譯 (/DYNAMICBASE)

* 內建的靜態程式碼分析 (Static Code Analyze) 可幫助做最初步的 code review
(不過分析時有時候會有一些微軟底層提供的東西也會被警示,就當作沒看到吧 =w=a)

另外有看到一個分析工具的延伸套件應該也不錯用
FxCop Integrator for Visual Studio 2010

無論如何,程式碼還是養成平常良好的寫作習慣,才是最根本的解決之道
工具充其量都只是補助而已 ^_^

* 使用標準註記語言 (Standard Annotation Language) 來強化你的程式碼
#include <CodeAnalyze/SourceAnnotations.h>
#include <sal.h>
使用 SAL 的 MACRO 可以簡化註記的定義
A Brief Introduction to the Standard Annotation Language (SAL)

* 一些新的函式庫 :
Parallel Pattern Library 支援平行運算
Aasynchronous Agent Library 支援非同步處理
Parallel Collection Content 支援平行運算專用容器

假使程式瓶頸發生在 CPU 的序列處理上,像是 sort 則適合平行運算
假使程式瓶頸發生在 I/O 的物理限制上,像是 fopen 則不適合平行運算

* Lambda 表示式
簡單說這就是 匿名函式物件 啦 XD
MSDN - Lambda Expressions in C++
樓上 MSDN 太難懂可以看下面的 blog :
Lambda Expressions in C++0x
C++0x:Lambda expression

中間有些筆記不夠完整的部分, 暫時沒辦法補完, sorry ...


* Cuncurrency Runtime
* Structureed Task Group
* concurrent_vector
* concurrent_queue
* combineable
* CSingleLock
* CMultiLock
* CSyncObject
* critical_session cs;
cs.lock();
cs.unlock();
combinealbe sums;
sums.local() += 3.33f;
...
sums.combine(std::plus);
* Parallel_for
* Parallel_for_each
* Parallel_invoke
* task_group
* Actor-Base
* Data-Flow



* IDE 已經有支援平行工作,平行堆疊等除錯能力
如果是撰寫多緒或是平行運算的程式,這個除錯功能是前幾個版本沒有的
個人認為是相當有幫助的一個新特性(也是早就該要有的功能啦XD)

===

關於 MFC, VS2010 有重新改善相關的開發支援:

* 全新 (?) 的 MFC 有支援 win7 外觀,像是華麗的 Ribbon 控制項
XP 看不到的 TaskbarPreview 與 Jump-List
資訊更豐富(設定更複雜)的 TaskDialog 可以強化傳統的 MsgBox
另外支援觸控,手勢等開發,還有也是新OS才有的自動重啟功能以及
顯示上的high-DPI支援,有大部分都是使用者體驗的強化功能

當然,開發者(某方面)的體驗也相對強化了......(苦笑)

其他相關情報 :
Visual C++ 2010: MFC new features.

* 多點觸控的 API支援 (Native Sensor API)
總算可以不依賴 .NET 了?
詳情可參考 :
MSDN - Sensor API
如果需要定位功能可參考 : (前提是系統要有支援相關硬體)
MSDN - Location API

* 底層新支援 Direct2D (Image) 與 DirectWrite (Text) 讓畫面顯示上更順暢
像是有支援硬體加速,新的漂亮字型等功能就不多提
這到底是不是雞肋?好想看看有沒有人拿出效能評比
噢,不過我最在意的是 XP 到底有沒有支援這碗糕 ...

結果令人不意外(喂!!)
MSDN - Direct2D
Run-Time Requirements : 沒有 XP , 完全被放棄了呀 ... (攤手)

底下有兩邊不錯的參考文:
Introducing the Microsoft Direct2D API
Introduction to DirectWrite

* Windows WebService API (SOAP Base Client)
可以利用這元件做簡單的網路服務提供以及接收
技術是走標準的 XML, 所以應用上應該不成問題...? (這我還沒試過)

總算是可以使用 C++ 來撰寫 SOAP 為主的 Web Service , 算是多一種選擇 ...
要注意的是,這東西似乎只支援 windoes 7 & server 2008 R2 以及之後的東西

其他相關資訊可參考以下連結 :
MSDN - Windows Web Services API
MSDN 論壇 - Windows Web Services API
MSDN - Implement Web Services with the Windows Web Services API

A first look at the Windows Web Services API

* 提供更多內建的控制項(Controls)
我個人是覺得有很多不錯的控制項啦,現在都不用自己做了 XD (像是 color picker)
有興趣的人可以看看以下網址:
New MFC Toolbar Controls in Visual Studio 2010
MFC Feature Pack for VS 2008 and 2010

* 很久以前 VC6 的類別精靈(Class Wizard)復活!!並且強化其相關的功能
(這對很多開發MFC的人來說是個好消息)

當然,有些可能會因為某些操作順序造成的傳統問題(像是手動刪除某些東西之後)
也一樣會出現 ... 嗯,你知道的 ...

一些其他的資源 :

* CJumpList (XP 跳不出來的東西)
Windows 7 Goodies in C++: Jump Lists

* CTaskDialog (加強版的 MessageBox)
CTaskDialog in MFC in Visual C++ 2010
CTaskDialog: an alternative to the simple message box!

有興趣的可以玩玩看這花俏的功能 =w=
咦?為何是花俏的功能?

a. 使用 MessageBox("請聯絡工程師!!");
b. 使用 CTaskDialog 顯示最詳細的訊息 ...

結果都是一樣的客訴, 而且最詳細的訊息通常都拿不到, 連畫面抓圖都沒有 ... (聳肩)
以上純抱怨 ... 有機會還是建議試試看新的 Dailog 啦 XD

* CDataRecoveryHandler
大家還記得 Office 當掉有時候會有自動存檔,之後自動復原文件等功能吧?
透過這類別,你的程式也可以擁有一定程度的自動存檔與自動復原的功能
可以有效降低因意外造成的問題與損失

Customizing MFC Document Recovery

===

關於 C++ 0x 新標準, VS2010 也開始有支援了 : (這東西講好久嚕XD)

* auto 關鍵字
這東西算是相當方便的一個新特性
利用編譯器的編譯時期推導型別,既可以保持強型別,又可以增加寫作彈性
真的是很佛心XD

舊的 auto 什麼的關鍵字可以丟了 ...
咦?你說哪裡有舊的 auto? ... 是啊,我也是第一次聽說 =w=

* decltype 關鍵字
這也是相當方便的一個新特性
跟 auto 一起使用,可以解決以前一些 template 難解的問題
可以大幅簡化範本的寫法,提升維護性

* Lambda 表示式
就是很多地方可以見到的"匿名函式物件"的一種新語法
如果是寫其他較高階語言的人,可能早就熟悉這種東西了吧(笑)
現在 C++ 總算是有支援了,可喜可賀(?)

基本上,即使沒有這東西,很多情況早就有傳統的解法了
即使不採用也不會有任何問題,不過如果用了也不會快到哪裡去 =w=

我個人是還看不出,有什麼一定要用這東西的地方
雖然應用上相當方便且有彈性,可惜語法不太直覺,要花一點時間去習慣

* R-Value Referance
可以大幅加速跟 move 有關的資料處裡,減少額外的臨時物件造成的效能浪費
我認為這算是最有實用性的一個改進吧!!把 C++ 的某個大弱點消除了

不過,一般人平常應該還是碰不到,只有寫比較底層或是自訂的東西才會遇到
新的 STL 等公用類別/函式庫也大多已經支援新標準,不需要特別修改程式碼
只要使用新的編譯器編譯,就可以享受更新更快速的程式執行結果!!

* static_assert
編譯時期的 assert, 在某些情況下相當好用...
最起碼不用等到執行期才來除錯,那會很累 orz

* null_ptr 關鍵字
這是我個人很喜歡的新特性,傳統的 NULL 只是個 MACRO,事實上也就是數值的 0
新的關鍵字可以讓編譯器分辨以及分析到底是數值的 0 還是代表指標的空值
不過這樣很多舊的程式碼就得變更 MACRO 或是重新修改寫法
如果要實施,對專案的衝擊可能還不小,請小心

其他關於 C++ 0x 的文章可以參考以下網址:
Rvalue References: C++0x Features in VC10, Part 2
C++ 語法再加強:C++0x

===

另外一個隱憂就是假設用了這些新特性,那就只能用新的編譯器去編譯了
專案某種程度上無法回頭或是向下相容,我認為這是大家要注意與評估的地方

沒有留言: