作者DonaldTrunnp (The US President)
看板Programming
标题Fw: [作品] C语言 型别安全的列表容器 (OpenGC3: linked list)
时间Mon Jan 2 16:53:51 2017
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1483341336.A.75F.html
※ 编辑: DonaldTrunnp (122.116.185.23), 04/05/2017 17:24:14