最近在看 YouTube 上的這部影片解釋 object, lifetime 還有 reference 相關的內容,裡面有個有個關於 prvalue 的範例讓我有點驚訝,驚訝地點在於 C++ standard 對於標準有定義的型態 (像是 primitive type) 跟未定義的型態 (像是 struct 或是 class) 有完全不一樣的行為,但為什麼會這樣定義卻想不通 = =
2018年6月26日
2018年5月25日
[C++] 利用 generic progamming 簡化存取 union 變數的介面
公司的程式 (特別是那種底層 API) 其實很常使用 union 來減少非必要的記憶體使用量,只是如果使用 union 的話就必須要能夠知道該用哪種型別來存取 union 中的變數,因此很常出現這種程式碼:
enum Type {Int, Double};
struct Data {
Type type;
union {
int i;
double d;
};
};
int main()
{
Data data;
data.type = Int;
data.i = 3;
data.type = Double;
data.d = 3.14;
return ;
}
簡單來說就是設定好要存取的是哪種型態 (然後用個 enum 來表示),接著 API 會根據設定的型態來對 union 中的變數做存取。以上面的範例來說,會根據 Data 中的 type 是被設定成 Int 還是 Double 來決定 是要存取 data.i 還是 data.d。
因為個人覺得這樣滿容易手殘的,特別是公司的 API 其實型別種類有點多 |||Orz,所以想要簡化 API 的使用方式,希望可以直接根據所設定的型別存取對應的變數就好,畢竟這種關聯性其實是固定的,利用 generic programming 應該是不難做到的。
2018年5月23日
[C++] static_cast & reinterpret_cast & C-style type cast
C 的型態轉換大家應該都很熟也很常用,不過在 C++ 中因為 C++ 的功能與語言特性複雜許多,C 語法的型態轉換一來不易辨識,二來其內部運作方式較為隱晦不清,因此 C++ 引入了四種型態轉換運算子,分別是
static_cast, dynamic_cast, const_cast 與 reinterpret_cast
大多數情況我們所使用的 C 型別轉換通常是對應到 static_cast;dynamic_cast 則是應用到繼承體系的型別上;const_cast 其作用只在於拔掉變數的常數性 (const) 與揮發性 (volatile),其餘維持不變;其中最玄的該數 reinterpret_cast 了,有部分 C 的型態轉換的使用情形對應過來 C++ 這邊其實是要用 reinterpret_cast
2018年5月22日
2018年5月7日
[C++] move semantic 的誤解
今天部門的讀書會上討論到 Effective Modern C++ 中介紹關於 C++11 開始引入的各項新特色與其相關問題,其中有個例子介紹到了 std::move 跟 std::forward 的使用時機。主講者也很有心的把其中某個例子自己嘗試寫了出來並加以變化來驗證,結果沒想到剛好可以變成一個說明何時不該使用 move semantic 的絕佳範例 XD 而且這也剛好說明了 C++11 引入了各項特色其實還...滿難懂的,也難怪會後會有人說其實乾脆不要用就沒這些煩惱。
2018年5月3日
[筆記] 線性時間內尋找中位數 (Median of Median)
要找一串未排序數字的中位數 (或者更廣泛一點,第 k 小的數字),最簡單的方法自然就是先排序後再找出來,當然,這種方法就會受限於排序演算法的複雜度,一般情況而言,最糟情況下會是 O(n log n)。不過因為我們在意的其實只有第 k 小的數字,所以就有人想辦法弄出了線性時間的演算法,這方法好像沒有明確的名稱,大抵上是利用 divide & conquer 的概念來做的,再加上原先是設計用來找中位數的,所以 google 的話可以用 Median of Median 當關鍵字來找。另外其實也有許多不同的方法,各有優缺點,可以依照實際應用情況來決定怎麼設計。
2018年5月2日
[筆記] K-D Tree v.s. Quad Tree
在計算幾何中其實很常會出現需要找出在座標平面上的一堆點或線段中位於特定區塊中的點或線段。舉例來說,想找出二維座標平面上找出落在 (0, 0) ~ (10, 10) 這個矩形區域點的所有點,並且對這些點做處理。常用的資料結構有幾個:
- R-Tree (可以衍伸出 R+-Tree, R*-Tree)
- K-D Tree
- Quad Tree
- Bounding volume hierarchy (BVH)
2018年4月25日
[筆記] MongoDB: Two Phase Commit - Multi-Document Transactions
這篇的內容主要是來自 MongoDB 官方網站上的 Manual 中的這篇。簡單總結:two phase commit 是為了模擬 Transaction 的特性。
2018年4月17日
[筆記] SGCheck: An Experimental Stack and Global Array Overrun Detector Table of Contents
SGCheck 是 valgrind 底下的 tool 之一,簡單來說這東西就是用來彌補 memcheck 的不足之處。memcheck 專攻的問題是 heap memory 中的 illegal access (invalid read & write) 以及 memory leak。相對的,SGCheck 則是對 stack memory 做檢測,特別是當使用 array 或 pointer 時確實無法完全避免不會有 illegal access。因此這兩者算是相輔相成的,只是比較常聽 & 用到的是 memcheck (也是memory bug 最常出現的地方)。
2018年4月12日
[筆記] RDBMS v.s. NoSQL
RDBMS v.s. NoSQL
現在主流的資料庫像是 MySQL 之類的是關聯式資料庫 (RDBMS),不過隨著網路的發展,關聯式資料庫的特性在某些應用上其實沒有那麼適合。比方說,你對於資料間的關聯性沒那麼在意,你在意的是特定人、事或物的 "狀態" 變動,特別是這種狀態的變動非常大量且頻繁時,關聯式資料庫在處理這種需求就會變得力不從心,也因此後來有發展出了 NoSQL 這東西是專門針對這種應用設計的。而這次被主管要求要看的 MongoDB 正是一種 NoSQL DB。
訂閱:
文章 (Atom)