一些程式設計技術

2021-08-28 06:48:31 字數 2558 閱讀 7715

大量程式設計資源

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 標記為共享以導致相...