c++数据结构代码整理_从c++到c

744f015f785e7c93237546c74d2519c3.png

5812f93739af4999c896bc32e2cd9777.png

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

上一个月研究了一套开源的memcached源码和粗略的看了一些libevent源码,在研究这两个开源的代码的过程中,就发现很多开源的比较底层一点的东西都是用的c语言写的,单纯的看c语言写的代码,然后我就在想为啥很多东西都用c语言写,而不是采用c++写呢?在网上收集了一些资料,然后很多人都提到c++的错误处理机制不太适合写基础的东西,原因有不外乎两个,一是c++错误异常处理的效率不高,二是担心在处理错误的时候又可能引发新的错误,这个很变态。

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

经过比较,我们就知道在链表数据结构上,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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值