Dev307

1,229 views

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,229
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Dev307

  1. 1.
  2. 2. Visual Studio 2010 與最新 C++ 整合開發<br />王建興<br />技術長<br />聖藍科技<br />DEV307<br />
  3. 3. 講者簡介<br />Education<br />Ph.D. Candidate, Department of Computer Science, National Tsing-Hua University, Taiwan<br />Research interests: distribute network management, mobile agent, VoIP, and p2p networking, sensor network<br />Book Translation<br />Thinking in Java 4nd Edition, in Traditional Chinese<br />Thinking in Java 2nd Edition, in Traditional Chinese<br />Essential C++, in Traditional Chinese<br />專欄<br />iTHome 電腦報程式人專欄<br />Honor<br />The champion of the Trend Micro Programming Contest 2004 <br />2009通訊大賽-Android手機軟體設計競賽第三名<br />
  4. 4. Agenda<br />Visual C++ Projects and the Build System<br />Microsoft Foundation Class (MFC) Library<br />IDE<br />Visual C++ Library<br />C++0x Core Language Features In VC10<br />
  5. 5. Visual C++ Projects and the Build System<br />
  6. 6. MSBuild<br />VCBuild.exe -> MSBuild.exe<br />.vcproj -> .vcxproj<br />.vsprops-> .props<br />
  7. 7. VC++ Directories<br />VC++ directories 設定目前分處兩地<br />可在 project property 處設定各個專案自己的目錄設定<br />也可在 Property Manager處設定全域的VC++ directories 設定<br />
  8. 8.
  9. 9. Project-to-Project Dependencies<br />在過去,projects 之間的相依性定義於 solution 檔中<br />在 VC++ 2010 中,相依性則轉換成為 project-to-project 的參照型式<br />
  10. 10. Custom Build Rules and .rules Files<br />在過去,自訂規則檔案為附檔名為 .rules 的XML檔案<br />在 VC++ 2010 中,自訂規則檔案則被拆成 .xml, .props, 以及 .targets 三種檔案<br />
  11. 11. Microsoft Foundation Class (MFC) Library<br />
  12. 12. Windows 7 Features<br />現在,MFC 支援諸多 Windows 7 的功能,像是<br />the Ribbon user interface<br />the Taskbar <br />jump lists <br />…<br />MFC 自動支援諸多 Windows 7 功能,因此,若要在新的應用程式中使用其他的新功能,使用 MFC Application Wizard 來指定即可<br />
  13. 13. MultiTouch Awareness<br />MFC 讓應用程式得以運用 MultiTouch 使用者介面<br />MultiTouch 應用程式能處理Windows touch 訊息以及手勢訊息<br />只需註冊所需事件,作業系統即會將 MultiTouch 事件繞送至你所註冊的事件處理常式<br />
  14. 14. High-DPI Awareness<br />預設情況下,MFC 應用程式皆為 High-DPI-aware<br />對 High-DPI-aware 的應用程式來說,作業系統會依據執行時的解析度,將視窗、文字、以及其他的 UI 元素做自動放大縮小<br />這能使得自動放大縮小後的排版依舊保持正常、不會被截去影像、或者有像素化的情況<br />
  15. 15. Restart Manager<br />Restart Manager 能在您應用程式預期或不預期的關閉或重啟之後,自動儲存文件或是重新應用程式<br />例如,當您的程式提供了自動更新的機制,那麼,在自動更新完成後,便可運用 Restart Manager 來自動重啟<br />
  16. 16. CTaskDialog<br />CTaskDialog 被可用來取代 AfxMessageBox<br />CTaskDialog 能顯示更多訊息,也能從使用者端回饋更多類資訊<br />
  17. 17. SafeInt Library<br />新的 SafeInt 程式庫提供了考慮整數運算溢位的運作操作<br />同時,它也能針對眾多不同類型的整數進行比較<br />
  18. 18. IDE<br />
  19. 19. Improved IntelliSense<br />舊式的 .ncb ( no compile browse ) 檔被 .sdf ( SQL Server desktop database) 所取代<br />更快、更精確、更能處理大型專案<br />當 header 改變時,毋需重新 parse 整個 solution<br />即使在大型專案中,僅更動小幅度程式碼或切換 build ( Debug -> Release ) 時,速度依舊更快<br />
  20. 20. Improved IntelliSense Errors<br />IDE 更能偵測會引發 IntelliSense 遺失的程式碼<br />IDE 會將 IntelliSense 的錯誤顯示於 Error List Window<br />
  21. 21. #include Auto-Complete Feature<br />IDE 增加了對 #include 關鍵字的 auto-completion<br />在輸入 #include 後,IDE 會產生下拉式清單供你挑選可用的 header file<br />輸入名稱不確定的 header file 時更方便<br />
  22. 22.
  23. 23. Navigate To<br />Navigate To 對話窗提供搜尋專案中符合特定字串之所有 symbol 以及檔案的功能<br />持續輸入搜尋字串,將會立即反映在搜尋結果上<br />
  24. 24.
  25. 25. Parallel Debugging and Profiling<br />Visual Studio 的除錯器能在使用 Concurrency Runtime 的情況下協助對平行處理的應用程式進行除錯<br />新推出的 concurrency profiler 工具也能以視覺化的方式呈現您應用程式整體的效能<br />
  26. 26. Ribbon Designer<br />Ribbon Designer 是讓您透過圖形式方式建立、修改 MFC Ribbon UI 的編輯器<br />最終的產出是 .mfcribbon-ms 的 XML 資源檔<br />
  27. 27. Call Hierarchy<br />協助你瀏覽被某一特定函式所呼叫的所有函式或是呼叫該特定函式的所有函式<br />Call From<br />Call To<br />取代 Call Browser<br />
  28. 28.
  29. 29. Visual C++ Library<br />
  30. 30. Concurrency Runtime Libraries<br />Concurrency Runtime framework 支援以 Visual C++ 開發並行執行的應用程式<br />Parallel Patterns Library (PPL) 為平行化提供更好的通用性型質的容器以及演算法<br />Asynchronous Agents Library 則提供了 actor-based 的程式設計模型、訊息傳遞的介面、以及將工作管線化的機制<br />
  31. 31. 並行性的例子<br />int nSum = 0;<br />for(int nNumber=1;nNumber<=100000;++nNumber)<br /> nSum += nNumber;<br />int nSum=0;<br />parallel_for(1, 100001, [&](int n)<br />{<br /> nSum += n; <br />} );<br />*Concurrency Runtime 作業系統至少需為 Windows XP SP3<br />
  32. 32. Standard C++ Library(1/2)<br />在 STL 中使用了新 C++ 語法來實作 move 語義以及完美轉發(perfect forwarding)<br />利用 rvalue references 來實作新的 unique_ptr class,做為 smart pointer type,更勝 auto_ptr 一籌<br />共加入了 15 個新函式,像是:find_if_not, copy_if, … <br />
  33. 33. Standard C++ Library(2/2)<br />新的 make_shared 函式在處理 shared pointer 時更便利、更穩固、也更有效率<br />新的 cbegin, cend, crbegin 以及 crend 提供對容器正向或反向走訪的 const_iterator<br />exception_ptr class 可被用來在執行緒間傳遞異常<br />
  34. 34. C++0x Core Language Features In VC10 <br />
  35. 35. *少林足球中片段<br />
  36. 36. 大師兄即將歸位<br />*少林足球中片段<br />
  37. 37. C++ 王者歸來<br />*魔戒三部曲海報<br />
  38. 38. 何謂 C++0x<br />目前一般所使用的 C++ 語法標準,實際上大部分應該都是所謂 C++98 / C++03 的 ISO/IEC 14882:1998、ISO/IEC 14882:2003 <br />尚在草案階段的 C++0x ( 讀音:see plus plus oh ex ) 則是 C++ 語言的新標準<br />Bjarne Stroustrup 宣稱 C++0x 將會近乎 100% 相容於現有的標準 C++<br />
  39. 39. C++0x Core Language Features In VC10: The Table (1/3)<br />*http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx<br />
  40. 40. C++0x Core Language Features In VC10: The Table (2/3)<br />
  41. 41. C++0x Core Language Features In VC10: The Table (3/3)<br />
  42. 42. 今天要談的 C++0x 特色<br />auto Keyword<br />decltype Type Specifier<br />Lambda Expressions<br />rvalue references<br />static_assert<br />nullptr<br />
  43. 43. auto Keyword (1/3)<br />auto 關鍵字能從所宣告變數的初始算式,導出其型別 ( 當然是編譯時期 )<br />auto declarator initializer; <br />int j = 0;<br />auto k = 0; // Variable k is implicitly type int<br />*http://msdn.microsoft.com/en-us/library/dd293667(v=VS.100).aspx<br />
  44. 44. auto Keyword (2/3)<br />map<int,list<string>>::iterator i = m.begin(); <br />auto i = m.begin(); <br />auto x = 1, *y = &x, **z = &y; // Resolves to int. <br />auto a(2.01), *b (&a); // Resolves to double. <br />auto c = 'a', *d(&c); // Resolves to char. <br />auto m = 1, &n = m; // Resolves to int. <br />
  45. 45. auto Keyword (3/3)<br />使用 auto 關鍵字時的重要限制<br />使用時一定要搭配 initializer<br />不能用來宣告陣列、變數的 return type、函式或 template 的參數 <br />除了 static member 之外,不能在 class/struct 中使用 auto 宣告 data member<br />
  46. 46. 錯誤的 auto 使用<br />auto a;<br />auto ary[10];<br />auto ary2[] = { 1, 2, 3}<br />auto foo();<br />void bar(auto a);<br />struct A<br />{<br /> auto a;<br />};<br />
  47. 47. 使用 auto 的時機<br />當資料型別可能隨著編譯器或目標平台而異時<br />例 strlen() 的回傳型別<br />當資料型別過於複雜不易表示時<br />例 map<int,list<string>>::iterator i <br />將 Lambdas 指派至變數時 ( 待續, Lambdas 算式 )<br />指定 Trailing Return Types ( 待續, decltype )<br />
  48. 48. auto vs. auto<br />/Zc:auto[-]編譯器選項是用來告訴編譯器看待宣告變數時 auto 這個關鍵字的確切意義<br />指定 /Zc:auto 編譯器會從所宣告變數的初始算式推導出其確型別<br />指定 /Zc:auto- 編譯器會以 automatic storage class 來宣告變數<br />此為相容性問題<br />*http://msdn.microsoft.com/en-us/library/dd293615.aspx<br />
  49. 49. const_iterator 的加強<br />for(vector<string>::const_iterator iter = <br /> Strings.begin(); iter != Strings.end(); ++iter)<br />{ std::cout << *iter << std::endl; }<br />for(auto iter = Strings.cbegin(); iter!=Strings.cend(); ++iter) {...}<br />*http://www.codeproject.com/KB/cpp/cpp10.aspx<br />
  50. 50. decltype Type Specifier (1/2)<br />decltype 是個 type specifier<br />decltype 依據所給定的算式來決定型別<br />decltype 不同於 typeid,因為它是從算式中得到型別本身,而非型別資訊<br />decltype( expression )<br />
  51. 51. decltype Type Specifier (2/2)<br />int var;<br />const int&& fx(); <br />struct A { double x; }<br />const A* a = new A();<br />decltype(fx()); // const int &&<br />decltype(var) // int<br />decltype(a->x) // double ( The type of the member <br /> access )<br />decltype((a->x)) // const double && (an expression <br /> instead of a member access )<br />
  52. 52. 使用 decltype 的時機<br />適當的表示資料型別<br />decltype 和 auto 不同的是,auto 推導型別是靠初始算式,得發生指派動作<br />decltype 只是從算式評估結果的型別來推導型別,但卻不會確切的進行評估<br />decltype(mstr.begin()->second.get_allocator()) under_alloc;<br />decltype(exit(0)) MyExitFunction();<br />*http://www.codeproject.com/KB/cpp/cpp10.aspx<br />
  53. 53. trailing-return-type <br />auto function_name( parameters ) −> decltype( expression )<br />{<br /> function_body;<br />}<br />template<typename T, typename U><br />auto myFunc( T& t, U& u)-> decltype( t + u ){<br /> return t + u;<br />}; <br />
  54. 54. Lambda Expressions(1/4)<br />基本上就像是個匿名函式(anonymous function)<br />LambdaExpression 使得函式可以在使用的地方定義,並且可以在Lambda 函式中使用 Lambda 函式之外的變數<br />比函式物件或函式指標方便且單純<br />[]() mutable throw() -> typeid<br />{<br /> //function body<br />}<br />
  55. 55. Lambda Expressions(2/4)<br />1.capture clause <br />2.parameter list <br />3.mutable specification <br />4.exception specification<br />5.return type<br />6.lambda body<br />
  56. 56. Lambda Expressions (3/4)capture clause<br />*http://heresy.spaces.live.com/blog/cns!E0070FB8ECF9015F!10575.entry<br />
  57. 57. Lambda Expressions (4/4)parameter list<br />不能有 預設引數<br />不能有可變長度引數列表<br />不能有不具名參數<br />沒有參數時,可省略 parameter list<br />int main()<br />{<br /> int x = 4;<br /> int y = 5;<br /> int z = [=] { return x + y; } ;<br />}<br />
  58. 58. 使用函式物件<br />struct FunctionObj {<br /> void operator()(int n) const {<br />// 操作一下 n<br /> }<br />}<br />…<br />for_each(v.begin(), v.end(), FunctionObj());<br />
  59. 59. 使用Lambda Expression<br />for_each(v.begin(), v.end(), [] (int n) {<br /> // 操作 n<br />}<br />
  60. 60. rvalue references<br />rvalue reference 被創造,其中最大的意義之一,便是為了提供更有效率的 move 語義<br />rvalue reference 語法<br />type-id && cast-expression<br />*http://msdn.microsoft.com/en-us/library/dd293668(v=VS.100).aspx <br />
  61. 61. lvalue & rvalue (1/2)<br />每個算式,若非 lvalue 便為 rvalue<br />lvalue 指的是在單一算式之後所代表的一個續存物件<br />例:++x<br />rvalue 指的是在算式評估結束之後,生命期便結束的暫時性物件<br />例:x++<br />能對它取址的即為 lvalue<br />*http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx<br />
  62. 62. lvalue & rvalue (2/2)<br />string one("cute");<br />const string two("fluffy");<br />string three() { return "kittens"; }<br />const string four() { return "are an essential part of a healthy diet"; }<br />one; // modifiable lvalue<br />two; // const lvalue<br />three(); // modifiable rvalue<br />four(); // const rvalue<br />
  63. 63. C++ 的複製問題<br />string s0("my mother told me that");<br />string s1("cute");<br />string s2("fluffy");<br />string s3("kittens");<br />string s4("are an essential part of a healthy diet");<br />string dest = s0 + " " + s1 + " " + s2 + " " + s3 + " " + s4;<br />每次 + 運算子執行時,都會產生一個暫時性物件<br />產生了八個暫時性物件!<br />
  64. 64. 問題出在那裡?<br />因為 s0 是個 lvalue 不能加以修改,所以在計算 s0 + “ “ 時,得建立一暫時物件<br />但在接著計算 (s0 + “ ”) + s1 時,可以直接把 s1 接到之前建立的暫時物件後,便毋需再產生第二個暫時物件,並捨棄第一個暫時物件<br />這便是 move 語義的核心觀念<br />
  65. 65. 在 C++0x 中 move 語義的實作 (1/2)<br />在 C++0x 中,每次 + 運算子被呼叫時,仍會產生獨立的暫時物件<br />但第二次呼叫 + 運算子時(例如在((s0 + “ ”) + s1)中),會將前一個暫時物件所配置的記憶體挪過來使用<br />只更動第二個暫時物件指標之值,而不重新配置並複製<br />第一個暫時物件的指標則指向 null,避免解構時的相關行為<br />
  66. 66. 在 C++0x 中 move 語義的實作 (2/2)<br />所以,若能偵測到處理的是 non-const rvalue 時,就可以直接挪用其記憶體<br />反正它很快就要被摧毀,又沒人在乎它<br />從 rvalue 建立物件,或指派 rvalue 物件之值至另一物件時,所謂的 moving,便是挪用其記憶體的動作<br />例如 vector 要擴展空間時,moving 就很重要<br />
  67. 67. rvalue reference<br />C++0x 引入了名為 rvalue reference 的新 reference,其語法為 Type&& 及 const Type&& <br />rvalue reference 與 lvalue reference 是不同的型別<br />但在語意上都一樣是 reference<br />
  68. 68. 兩種 reference 在函式重載時的不同行為<br />Type& 只能繫結到 non-const lvalue <br />const Type& 可以繫結到任何東西<br />Type&& 可以繫結到 non-const lvalue 及 non-const rvalue <br />const Type&& 可以繫結到任何東西 <br />
  69. 69. rvalue reference 的overload resolution<br />void purr(const string& s) {<br /> cout << "purr(const string&): " << s << endl;<br />}<br />void purr(string&& s) {<br /> cout << "purr(string&&): " << s << endl;<br />}<br />string strange() {<br /> return "strange()";<br />}<br />const string charm() {<br /> return "charm()";<br />}<br />int main() { string up("up"); const string down("down"); purr(up); // purr(const string&): up purr(down); // purr(const string&): down purr(strange()); // purr(string&&): strange() purr(charm()); // purr(const string&): charm()} <br />
  70. 70. 提供 move 語義<br />傳統的 copy 建構子<br />C++0x 中的 move 建構子<br />編譯器並不會提供預設的 move 建構子<br />Simple(const Simple&);<br />Simple(Simple&&);<br />*範例取自 http://www.codeproject.com/KB/cpp/cpp10.aspx#RValues<br />
  71. 71. move 建構子被呼叫<br />Simple GetSimple()<br />{<br /> Simple sObj(10);<br /> return sObj;<br />}<br />
  72. 72. 實作 move 建構子(1/2)<br />class Simple<br />{<br /> // The resource<br /> void* Memory;<br />public:<br /> Simple() { Memory = nullptr; }<br /> // The MOVE-CONSTRUCTOR<br />Simple(Simple&& sObj)<br /> {<br /> // Take ownership<br /> Memory = sObj.Memory;<br /> // Detach ownership<br /> sObj.Memory = nullptr;<br /> }<br />};<br />
  73. 73. 實作 move 建構子(2/2)<br />Simple(int nBytes) <br /> { <br /> Memory = new char[nBytes]; <br /> }<br /> ~Simple()<br /> {<br /> if(Memory != nullptr)<br /> delete []Memory;<br /> }<br />};<br />
  74. 74. move 指派運算子<br />傳統的 copy 指派運算子<br />C++0x 中的 move 指派運算子<br />void operator=(const Simple&);<br />void operator=(Simple&&);<br />
  75. 75. 實作 move 指派運算子<br />class Simple<br />{<br /> ...<br /> void operator = (Simple&& sOther)<br /> {<br /> // De-allocate current <br /> delete[] Memory; <br /> // Take other's memory contnent<br /> Memory = sOther.Memory; <br /> // Since we have taken the temporary's resource.<br /> // Detach it!<br /> sOther.Memory = nullptr;<br /> }<br />};};<br />
  76. 76. static_assert Declaration (1/2)<br />在編譯時期針對指定條件檢驗是否成立<br />constant-expression: 若值評估為 0,則編譯失敗並顯示string-literal參數之值,反之,則無任何影響<br />static_assert( <br /> constant-expression, <br /> string-literal <br />);<br />
  77. 77. static_assert Declaration (2/2)<br />應用:<br />static_assert(<br /> sizeof(void *)==4,<br /> "64-bit code generation is not supported.");<br />
  78. 78. static_assert 與傳統方式的比較<br />在過去有兩種檢查方式<br />條件編譯 + #error 指令 ( 在 preprocessing 階段 )<br />assert 巨集 ( 在 runtime )<br />#error 無法針對 template 參數進行檢查,因為 class 是在編譯時才會被 instantiated<br />static_assert 是在編譯時期進行檢查,所以可以處理 template 參數的檢查<br />
  79. 79. nullptr Keyword<br />nullptr 關鍵字用來表示指向空值的指標<br />解決 0 和指向空值指標的混淆情況<br />void f(int){ printf( "intn" ); } <br />void f(char*){ printf( "char*n" ); } <br />f( NULL ); // int, compile error in GCC <br />f( 0 ); // int <br />f( (char*)0 ); // char* <br />f( (void*)0 ); // compile error <br />*http://heresy.spaces.live.com/blog/cns!E0070FB8ECF9015F!10891.entry<br />
  80. 80. Q & A<br />
  81. 81. http://technet.microsoft.com/zh-tw/default.aspx<br />Resources for IT Professionals<br />http://msdn.microsoft.com/zh-tw/default.aspx<br />Resources for Developers<br />http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx<br />C++0x Core Language Features In VC10: The Table<br />其他資源<br />http://heresy.spaces.live.com/blog/cns!E0070FB8ECF9015F!10386.entryC++ 語法再加強:C++0x<br />http://endlesschildhood.blogspot.com/2009/03/rvalue-references-c0x-features-in-vc10.html<br />Rvalue References: C++0x Features in VC10, Part 2<br />
  82. 82. 請協助完成「本課程問卷」,並在離開教室時交給工作人員!<br />填妥大會背包中的大會問卷,可於活動第三天兌換問卷禮哦!<br />感謝您的合作。<br />
  83. 83. © 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.<br />The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.<br />

×