大量程式設計資源
com 技術按我看來,他的思想是很有用的,實現dll二進位制相容,用 guid,clsid 等全域性唯一的id 標識元件的介面。
值得學習一番
code project 這個**很多windows的技術和示例**
com的通俗解釋
當然微軟的官方文件也是必不可少的
www.gotw.ca
現代cpp 慣用法的更迭,當年的奇技淫巧
神奇的wiki**
異常安全的要求(共同的基本要求:發生異常時,保證資源都及時釋放,無資源洩露。)
1、無異常,必定成功,或者說該函式能正確處理所有可能的異常,不會讓異常繼續傳播。
2、強異常保證,操作要麼成功,要麼回滾。此時物件的狀態要麼是成功後的,要麼是操作發生前的(本質就是事務,所以額外代價可能很大)
3、基本的異常保證,發生異常時,物件都處於乙個合法的狀態(但物件的狀態可能發生了改變,回不去操作發生之前的狀態了)
cpp中典型的思路是 resource acquisition is initialization (raii),用物件的生存期代表資源的生存期,只要析構和建構函式正確,即使異常發生也會呼叫析構函式釋放資源。
智慧型指標就是重要工具。例如shared_ptr會共享資源所有權,資源的獲取是使用者決定的(何時new或者reset),而非物件構造的時候就獲取資源。這類通過引用計數管理資源的方式可稱為 resource release is destruction。
異常發生的難點
實現異常安全的方法:
命名空間,實參型別查詢,類作用域,using宣告,過載 和 名字查詢。
這裡又扯到了為類定義乙個特製的 swap操作的最佳實踐。本來按我的想法,類成員函式定義乙個swap( type& rhs ); 即可,呼叫的時候a.swap(b) 即可。這種顯式呼叫對於各種具體類是沒問題的。既不會呼叫到std::swap這個通用版本(可能造成不必要的深複製),也不會有名字衝突的可能。
但是缺點在於這個swap的被使用範圍太小了。容器內部用的是swap(a,b)的形式,因為型別type未必有swap成員函式,或者說避免要求型別引數提供swap成員,所以模板容器內不能用a.swap(b)的形式。
那麼如果乙個類僅僅提供了成員函式,那麼在容器內只能呼叫std::swap, 而沒法讓類特製的swap生效。因此為了令特製的swap在容器裡頭生效,需要為類提供乙個非成員函式friend void swap( type&a, type&b);
或者 `void swap( type&a, type&b )
c++的名稱查詢規則:找到當前作用域可見的swap以及實參型別查詢即(type所在的命名空間中的swap),這些swap都是過載函式的候選函式集合,從中找到精確匹配的最特化版本。
為了異常安全,swap也要保證不出異常並且標記noexcept,從而可用 copy&swap的手法保證異常安全。
獲取陣列長度
傳統做法
#define countof( array ) ( sizeof( array )/sizeof( array[0] ) )
用巨集的壞處是沒有型別安全,不能阻止使用者對指標的誤操作。
用模板可以做到,核心思路是陣列型別的引用在模板型別推斷時不會退化為指標。
template< typename t, size_t n>
constexpr size_t arrsize( t (&a)[n] ) noexcept
引數採用引用的形式,陣列的長度資訊得以保留,n是根據型別自動推導出來的。感覺很神奇。還有兩個細節就是 noexcept和 constexpr。 標記為noexcept可以向編譯器提供更多資訊做優化。 constexpr則使得函式可以在編譯期使用,例如宣告陣列的長度之中。
在過去沒有 constexpr,則需用難看的方法實現
template char ( &arraysizehelper( t (&array)[n] ))[n];
#define countof( array ) (sizeof( _arraysizehelper( array ) ))
這裡的 arraysizehelper是乙個模板函式,接受乙個長為n的陣列的引用引數 t (&array)[n],返回乙個長度為n的char陣列的引用。 注意這個模板函式沒有函式體的,僅僅是為了把這個模板函式的返回值的型別給 sizeof 操作符,從而得到n的值。
待了解的內容
effective modern c++ 關於型別推導的討論,模板引數分為三大類
成員函式的指標(靜態成員函式,普通成員函式,虛函式三種)
模板的特化
非同步的框架怎麼做到(目測要事件,訊息,發布訂閱模式,訊息佇列?)多執行緒似乎不是必須的,例如js就是單執行緒的非同步。
c++ 11 / c11 自帶的同步設施,openmp的使用,simd的使用
跨語言邊界呼叫的原理(參考swig等)
多核並行程式設計技術 一
首先需要先理解幾個概念 序列 最基本的程式執行方式,序列程式的整個執行時,只有乙個呼叫棧和乙個執行時上下文,單程序 單執行緒程式可以認為是序列程式。併發 多執行緒出現後比較常見的程式執行方式,多執行緒程式執行時,會有多個執行時上下文和對應的多個呼叫棧。邏輯上多個執行緒同時發生,物理上是有作業系統排程...
Nios Flash程式設計技術
1.1 altera支援cfi flash程式設計 1.3 非支援cfi程式設計 由於我所用的nor flash晶元是am29lv320db,不再nios支援的列表,自己編輯了override檔案,但還是無法正確program進去,決定用列表支援的sst39vf800試一試,引腳相容,容量為1 4,...
DLL程式設計技術
一 dll原理 dll dynamic link library 也就是 動態鏈結庫 是乙個可以被其它應用程式共享的程式模組,其中封裝了一些可以被共享的程式或資源。它雖然包含了可執行 卻不能單獨執行,而應由相應的應用程式直接或間接呼叫。在 windows 32 中,可以將 dll 標記為共享以導致相...