上一个月研究了一套开源的memcached源码和粗略的看了一些libevent源码,在研究这两个开源的代码的过程中,就发现很多开源的比较底层一点的东西都是用的c语言写的,单纯的看c语言写的代码,然后我就在想为啥很多东西都用c语言写,而不是采用c++写呢?在网上收集了一些资料,然后很多人都提到c++的错误处理机制不太适合写基础的东西,原因有不外乎两个,一是c++错误异常处理的效率不高,二是担心在处理错误的时候又可能引发新的错误,这个很变态。
自己在研究开源代码的时候,发现其实还有一个很重要的问题,导致很多人选择用c语言开发底层的东西的一个理由,因为一个底层的东西最重要的就是稳定性和效率,至于效率c语言和c++本身现在差距不是很大,但是稳定性,c语言就比c++的稳定性好很多了,尤其是那些只重视业务的c++开发工程师,几乎在程序里面滥用stl里面的东西,因此开发出来的东西基本上是可以运行的,但是如果考虑到长时间的稳定性,这个真不敢保证。而且就c语言和c++的相关数据结构,c语言的数据结构模型确实比c++的数据结构模型好很多。
在c++里面实现一个链表基本格式如下:
class Person
{
Int age;
Int weight;
};
Stl::list <person*> people;
C语言的实现方式如下:
Struct person
{
Struct person* prev;
Struct preson* next;
Int age;
Int weight;
}
Struct
{
Struct person* first;
Struct person* last;
}people;
这两种语言各自的实现方式在内存中的模型如下:
经过比较,我们就知道在链表数据结构上,c的内存模型比c++的内存模型要好很多,其实最近看另外一个c语言写的大型开源代码,发现里面就hash的数据结构还有其他一些常见的数据结构,c都比c++ 好一些。
在上面的链表比较模型中,其实有很多人会提出,c语言的代码的可复用性不够高,就是一个链表,链表里面装的东西不一样,定义很复杂,还有针对链表相关的操作也需要重新写很多代码,当然提出这样疑惑的人,肯定都是普通的c语言使用者,就跟我刚开始接触纯c写的项目的时候一样,其实在c语言里面也有成熟的数据结构,只不过这种成熟的数据结构不是很多人都知道的,而只是在项目中使用。
C语言大家都知道是面向过程的语言,同时现在几乎所有的人写代码都是采用面向对象的思想,也正是因为了有了面向对象的思想,然后将软件开发的难度降低了,普通的开发人员只需要去关注软件的业务功能,而不用操心实现也许需要采用的数据结构,以及数据结构对应操作的很多代码,让程序员从复杂的数据结构里面解脱出来,只需要关心业务,应用已经实现好的数据结构就可以了。那么在面向过程的c语言里面,如何实现出面向对象的代码,能够很好地将数据结构封装起来呢?下面我就从一个开源项目里面挖出来了一个简易版的c语言里面通用链表的实现。
#define LST(name,type) \
Struct name \
{ \
Struct type * first; \
Struct type * last; \
}
#define LST_ELM(type) \
{ \
Struct type * prev; \
Struct type * next; \
}
#define LST_FIND_IMPL(name,head,type,elm) \
Inline bool name##_lst_find(name* head,type* elm) \
{ \
//这里是一些逻辑操作 \
}
#define LST_FIND(name,head,type,elm) name##_lst_find(head,elm)
这样上面就基本实现了一个简单的通用链表,只是还有很多的操作函数没有实现,那么接下来就是使用了,比如我现在有一个person类,需要存放到链表里面,代码实现如下:
Struct person
{
LST_ELM(person);
Int age;
Int weight;
};
Typedef LST(people,person) people; //定义数据结构
LST_FIND_IMPL(people,head,peron,p) //定义函数
People head; //定义对象
LST_FIND(pople,&head,person,p) //调用函数
上面基本就算是完成了通用链表的实现,只是在实现的宏的过程中很多取参数的地方,并没有写的那么好,大概的思路就是这样,如果在项目中使用的话,那么代码是需要好好研究推敲的,不是这样丑陋的代码就可以直接放到项目中的,否则,你痛苦的debug即将开始。
时间不早了,吃饭去了!!!