关于C++的一些思考和总结

        最近一年半的时间,因为工作内容切换的缘故(从Infrastructure切换到DL和CV),开始大量使用C++作为开发工具。这一年多也花了不少时间在机器学习和算法的学习补充和积累上,也没有太多时间深入编程语言领域。年底了,忙里偷闲,这块的功课也可以做一个总结了。

       开始工作的很长时间都是使用C语言,刚开始使用C++的时候很不习惯。正式接触是rocskdb这个项目,代码只是外围的接口和调用部分,写的代码基本都是C语言风格的C++。刚开始意识到C++的特性是一个泛型问题,大致是这样的:封装rocksdb的api实现redis的多个类,一个数据结构一个类,现在需要针对这个多个类实现一个迭代器;如果用C++的泛型,只需要用一个泛型类即可。开始的时候对模板元变成不太熟悉,索性用到的类型也不多,用了比较丑陋的方法完成的任务。不过这个问题也意识到C++泛型的强大。

       真正大量使用C++是opencv相关的开发。初步的感觉有那么几点:

       1. 调用C++的api进行面向对象编程做业务逻辑的话,跟java等其他语言类似,都是比较方便,不像C语言这么原始。

       2.C++的std库还是提供了不少容器类,相对于C语言用起来方便。因为C语言本身不提供容器,类似的功能一般大型公司会自己实现一套池化的数据结构,这样的话如果换一个开发框架,就要重新学习。

       3.C++的面向对象和多态也比较重要,方便抽象接口,比如opencv里面,一个功能(比如目标跟踪、检测)可能有多重不同算法实现,这是非常常见的。

       以上节点还是比较容易上手和熟悉起来的。后面继续深入遇,就遇到了一些困难。主要的问题还是对C++对资源管理的处理方式,不太习惯。C++高手讲究的是智能指针,资源不要手工释放,而是显示申请隐式释放;声明一个对象就会创建资源,申请资源的构造函数需要作者自己编写,所以说是显示;对象作用域结束,析构函数自动释放资源,通过智能指针的方式,编译器生成释放的代码而不用自己手写,这里又是隐式;同时涉及到容器问题,还经常有移动构造,这个在rust语言里面叫所有权转移。这种资源管理的风格,跟C语言的风格(纯手工)完全不同,C里面所有对资源的管理都是讲究手工申请和手工释放;跟java之类带GC语言也完全不同,java是纯自动。手工写代码工作量大,忘记释放就会内存泄漏,但是这也足够灵活,对释放的时机没过多要求,不同对象之间没有太多耦合。C++的智能指针还是坑比较大,用起来方便,想用好不容易,对于对象之间的耦合关系要提前规划好。

       C++强大的地方就是灵活,灵活这个词贬义的方面就是杂糅,不统一。可以把C++当C语言这样来写,new,指针,全局变量乱飞;但显然这不是C++作者所喜欢的风格。实现一个高性能的C++的框架对编程者的要求还是很高的。以opencv为例,opencv有不少学术界参与者,学术界参与者的关注点不在代码质量上,不同作者自身的编程水平也有差别,所以最终的代码质量也会参差不齐。笔者优化了一个KCF算法的代码(目标跟踪算法),把方法中的临时变量全部改为了类成员,性能竟然有20%多的提升。opencv对线性代数的支持很全,有些openblas里面没有的opencv都有,问题是性能均表现不佳。

       无论如何代码质量如何,对于opencv这样一个非常复杂的、大型的视觉算法库来说,使用C++还是首选。再一个感觉,现在对于C++ 11用起来还比较顺手,再后面的FP的确还很不习惯。调试中偶尔遇到过mxnet这种重度使用FP的框架来,感觉C++的FP让代码可读性变得很差。

       一点小的吐槽,C++但是对应用的友好度还是差了点,虽然现代C++已经有了json toml 等开源的库可以用,不过好像找一个http client,应为版本兼容性问题导致我后来用了个C语言的http client。json的c++库也要求gcc版本比较高,导致我在centos 7上无法编译,还好现在有docker。当然C++标准库功能不是很全,也有另外一个原因就是,那就是很多C语言有的东西,特别lib C API,C++标准库就不支持了。个人习惯还是觉得混合编程不太习惯,如果写C++,最好不要出现C里面NULL这种东西。

      如果做深度学习、机器学习相关的技术落地项目,C++还是绕不过的一个槛。现在比较流行的深度学习框架都是C++实现算子,用python分装出来api给算法工程师来写训练的代码。如果是在云端,似乎出来做底层框架的人之外并不需要C++。当时如果在终端设备或者边缘设备上讲究性能的地方,恐怕还是绕不开C++。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值