Fw: [作品] C語言 型別安全的列表容器 (linked list)

看板Programming作者 (The US President)時間7年前 (2017/01/02 16:53), 7年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
C語言雖然缺乏語言級別的多型,但是還是能透過巨集的形式來呈現 其中最著名的不外乎是 Linux Kernel 中的 typeof() 跟 container_of() 由於C語言一直缺乏一個高階抽象且型別安全的高效能容器 於是我決定開始著手重造一個比現有的輪子更好的輪子(咦? 概念上是這樣的: 所有的巨集都在編譯時期展開,因此編譯器中的優化器能更好地安排暫存器的使用 內部的實作都沒有不安全的型態轉換,所以既是型別安全的也是多型的 (polymorphism) 以下是與現有的 C 容器以及 C++ STL 實作的比較 在記憶體使用上插入 32 位元整型只要其他的一半:http://imgur.com/a/jKp7q 甚至在速度方面也比之中最快的 STL 還要快上 15% (Clang/LLVM) ~ 25% (GCC) 當然擁有直覺的界面的也是很重要的,以下是一個簡單的範例說明如何用它排序 struct: #include "ccc/ccxll.h" #define COMPAR_STR(a, b) (strcmp(DREF(a)->name, DREF(b)->name) <= 0) struct ptt_board { char *name; int year_est; } rec[] = { {"Gossiping", 1999}, {"C_and_CPP", 2000}, {"WomenTalk", 2003} }; ccxll(struct ptt_board *) list; // 宣告一個的指向結構指標的列表 ccxll_init(list); // 對剛剛宣告的列表初始化 for (int cnt = 0; cnt < 3; cnt++) ccxll_push_back(list, rec + cnt); // 將指針們依序插入至列表的後方 ccxll_sort_extd(list, COMPAR_STR); // 根據比較器來排序結構中的字串 CCXLL_INCR_AUTO(prec, list) // 正向遍歷列表並印出所有的元素 printf("%s: EST. %d\n", (*prec)->name, (*prec)->year_est); ccxll_free(list); // 別忘了手動銷毀剛剛建立的列表 如果好奇有關實作細節的 或是 覺得很有趣也很實用的話 please click a star! 以下是 「OpenGC3 的 GitHub Repository: https://github.com/kevin-dong-nai-jia/OpenGC3」 無論如何,期待大家的回覆,我很樂於傾聽大家的建議噢~(燦笑 -- ※ [本文轉錄自 C_and_CPP 看板 #1OQVuOTV ] ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.51.165 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1483341336.A.75F.html ※ 編輯: DonaldTrunnp (122.116.185.23), 04/05/2017 17:24:14
文章代碼(AID): #1OQXKXNW (Programming)