现在的位置: 首页 > 综合 > 正文

CTO们关于C/C++的经验

2018年03月30日 ⁄ 综合 ⁄ 共 2159字 ⁄ 字号 评论关闭

1、越界
    越界是最难查的,注意memcpy strcpy,strncpy这些函数使用前一定要检查边界。特别是你提供函数给别人用时,你的函数中用到了这些东西,一定要检查别人传给你的指针的边界。
2、变量初始化
    这种问题要养成好习惯,否则出来偶然性问题,非常难查。
3、多线程指针管理
    在多线程环境下使用指针时,最好采用引用计数,让最后一个放充引用计数时,指针删除,避免一个线程在使用指针,另外线程删除掉。
4、多线程锁的管理
    多线程锁要粒度要适中,尽量减少一个函数进入多个锁,避免一个大函数一个大锁影响性能,可学习数据库的表级,行级锁。尽量不要在回调函数中放锁,易引起死锁。做到线程安全函数单向调用,上层往下层调用,下屋向上层采用事件驱动反馈,避免调用栈过深,易引起死锁。
5、多线程对象生存期管理
    尽量当多线程共享对象尽量不要直接删除,建议采用状态机形式来管理,其它线程设置状态由一个线程统一按状态管理生存期。
6、构造函数
    函造函数中不要放虚函数,绝对不要在构造函数中开线程,并且线程调用自己的成员。
7、内联
    虚函数不要内联
8、多线程创建办法
    如果用C运行库函数,要注意用C运行库的方法
9,内存管理
    建议采用内存池管理
10、线程生存期管理
    线程中尽量不要调用同步函数,不要强行杀线程,要让线程不断循环,等待死亡信号自己退出。
----------------------------------------------------------------------------------------------------------------------------------
1、传递数组时带上一个指定的长度,接受方只拷贝指定长度,这样就可以轻松查明越界出错的责任方了,面对成K上M的数据块,多传个int,不见得效率低多少
2、一般来说多线程的东西都可以用各种"回调"机制来解决,理由1、没有那么多CPU可以用,何必开那么多线程?理由2、提高周边I/O的速度和开多少个线程关系不大,现在CPU那么强劲,单线程足够搞定所有I/O操作。不涉及纯计算实在看不出多线程的优势。相信不是每个做搞开发的都在和天气预报之类的计算打交道的吧?没有那么线程,那剩下的一切都不再是问题……,多CPU不是那么玩的
3、多尝试异步架构,同步固然简单,但现在世界上的潮流一般都是异步的,因为异步写出来的程序很流畅,再大的负荷也不怎么占CPU资源。CPU的速度比周边IO要快的多,很多新人写程序,向网络发个包,往磁盘上写点数据,CPU也高得惊人,这个问题值得反思。虽然异步程序的开发方法往往很晦涩,但是很多目前的前沿技术都是为了解决异步调用,从原始的直接调用函数接口,到微软的消息模型,到com的接口,到开源包中五花八门的信号、接口,对象函数等等,都是为了解决让如何让异步调用变得更简单。而且良好的异步也必然会推导出很好的模块化构造,不像同步会纠缠在一起,使用同步,往往会发现模块化只不过是召之即来、挥之即去的面子工程而已
4、智能指针的计数在交叉引用等罕见的情况下也会不准,导致内存泄露,所以不要太迷信这个东西。有的人遇到类似问题直接使用weak指针来减少一次计数的数目。但,实际上,大部分这类极少遇到的内存泄露,都可以通过适当的传值方式和良好的设计来解决,能出现这样的问题,往往是设计的不合理,而不是指针本身的问题
5、模板和多态目前来争执的比较厉害。模板可以减少大量的代码开发,多态则在对象类型检查上很有优势,则建议新人们两手都要抓,两手都要硬,取长补短,但要设计时小心,两者初期会因“兼容”的问题把你搞得焦头烂额,需要多写写,积累足够的经验来规避可能的问题
6、boost目前是未来的趋势,据说有的老外看了一眼boost::asio,就立即放弃ACE了,http://lists.boost.org/mailman/listinfo.cgi/boost 是boost的邮件列表申请地址,就算没得问,在里面多看看大师们都在八卦啥,锻炼锻炼英语也好……
7、C++相对Java之类的,只要把所有指针都包裹起来,内存泄露不是主要问题。C++现在最大的问题是移植,写代码多用std::basic_string<TCHAR>,少用CString,很多基础功能多用用标准库,MSDN固然提供很多功能,但为了移植方便,要更多的在公共库上做文章,除了必须用到的windows功能,尽量不要在自己的代码里直接调用windows的api,自己的程序尽量调用标准库包装好的接口
8、不要相信很多人打着所谓的裸不裸指针“效率”高不高的问题。多压几层栈,浪费几十个CPU周期,不见得就效率低下了。如果用异步模式写代码,取消掉等待那些“慢速IO”所浪费的上万个CPU周期,效率不知道能提高多少。打蛇打七寸,找问题要找关键。一眼能看出来的,往往不是最后结论。要知道,用裸指针写数据块、裸函数接口去回调,程序本身的重构、兼容、出错、释放,遇到多出口的函数,四处埋地雷一样的放delete、free等等,综合损失不是一个数量级的,裸接口会让重构的人烦到根本不想碰程序。而且null object概念的提出,更是让裸指针无法望其项背。

抱歉!评论已关闭.