![744f015f785e7c93237546c74d2519c3.png](https://img-blog.csdnimg.cn/img_convert/744f015f785e7c93237546c74d2519c3.png)
![5812f93739af4999c896bc32e2cd9777.png](https://img-blog.csdnimg.cn/img_convert/5812f93739af4999c896bc32e2cd9777.png)
出来工作,就一直使用C++,用C++也写过不少的东西,做过网络服务器,做过游戏,也用MFC或者QT做过客户端,研究过SLT部分源码,因此对于C++这个语言来说,谦虚点的说法,就是熟练掌握C++,不谦虚的说法就是精通C++。
上一个月研究了一套开源的memcached源码和粗略的看了一些libevent源码,在研究这两个开源的代码的过程中,就发现很多开源的比较底层一点的东西都是用的c语言写的,单纯的看c语言写的代码,然后我就在想为啥很多东西都用c语言写,而不是采用c++写呢?在网上收集了一些资料,然后很多人都提到c++的错误处理机制不太适合写基础的东西,原因有不外乎两个,一是c++错误异常处理的效率不高,二是担心在处理错误的时候又可能引发新的错误,这个很变态。
![889679210118c1d7eab1cc1121024cab.png](https://img-blog.csdnimg.cn/img_convert/889679210118c1d7eab1cc1121024cab.png)
自己在研究开源代码的时候,发现其实还有一个很重要的问题,导致很多人选择用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;
这两种语言各自的实现方式在内存中的模型如下
![3a4548d0d2d896ea6f00e0df4de3f50c.png](https://img-blog.csdnimg.cn/img_convert/3a4548d0d2d896ea6f00e0df4de3f50c.png)
经过比较,我们就知道在链表数据结构上,c的内存模型比c++的内存模型要好很多,其实最近看另外一个c语言写的大型开源代码,发现里面就hash的数据结构还有其他一些常见的数据结构,c都比c++ 好一些。
#include <stdio.h>
int main()
{
printf("学习从来不是一个人的事情,要有个相互监督的伙伴n");
printf("工作需要学习C/C++或者有兴趣学习C/C++的伙伴可以家我球球_2208165112n");
return 0;
}
在上面的链表比较模型中,其实有很多人会提出,c语言的代码的可复用性不够高,就是一个链表,链表里面装的东西不一样,定义很复杂,还有针对链表相关的操作也需要重新写很多代码,当然提出这样疑惑的人,肯定都是普通的c语言使用者,就跟我刚开始接触纯c写的项目的时候一样,其实在c语言里面也有成熟的数据结构,只不过这种成熟的数据结构不是很多人都知道的,而只是在项目中使用。
![35d4d3009c99a3e23ef0b6bca7c7efed.png](https://img-blog.csdnimg.cn/img_convert/35d4d3009c99a3e23ef0b6bca7c7efed.png)
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即将开始。
原文:
从c++到c - SunminpSun的专栏 - CSDN博客blog.csdn.net![22b1af25d6139383879334665f672847.png](https://img-blog.csdnimg.cn/img_convert/22b1af25d6139383879334665f672847.png)