从c++到c

    出来工作,就一直使用 C++ ,用 C++ 也写过不少的东西,做过网络服务器,做过游戏,也用 MFC 或者 QT 做过客户端,研究过 SLT 部分源码,因此对于 C++ 这个语言来说,谦虚点的说法,就是熟练掌握 C++ ,不谦虚的说法就是精通 C++

         上一个月研究了一套开源的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即将开始。
    时间不早了,吃饭去了!!! 
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值