Win32:C/C++/MFC编码规范总结

本文列举了一系列编程最佳实践,包括资源ID的管理,代码的严谨性要求,避免混搭不同版本的函数族,限制goto的使用,优化锁的使用,提高代码可读性和性能。强调了内存对齐,函数和类的设计原则,以及性能提升的技术,如使用引用类型,避免宏定义,减少I/O操作,优化数据结构和内存管理,以及线程和内存池的使用。此外,还提到了软件设计的其他重要方面,如避免需求传递损失和保持代码稳定性。
摘要由CSDN通过智能技术生成

1、为国际化方便、resource里资源ID不能重复,每个控件须命名(STATIC也不例外),每个窗体分配500个ID(预留一部分),各窗体ID段之间须预留100个编号为后期扩充之需;

2、代码编写务求严谨,编译不允许出现warning、0警告是必须的、逻辑路径要全、不允许半开半闭的逻辑路径;

3、不同版本函数族、禁止混搭(比如多线程函数族:C运行时库 _beginthread/ex, C++ std::thread,Win32 CreateThread/WaitXXX系列, MFC AfxBeginThread系列,内存分配函数族 malloc/free 和 new/delete,字符串函数族 _tcsxxxx, strxxxx, wcsxxxx, 三套函数);

4、非万不得以,不要用goto语句,实在必须,请用MQ机制;

5、不要加无效锁、不要在遥远的非共享代码段前后加锁,==0,请只在共享代码段前后加锁,否则==0;

6、相等关系运算符,一律用 if (常量== 变量)形式,不允许用 if (变量== 常量)的形式,避免少写个=产生赋值;浮点数一律用差值小于某阈值,比如0.0000001

7、消息映射一律放到DECLARE_MESSAGE_MAP()里面去,不要零散分布到处都是;

8、由于内存对齐原因,请将相同基本类型的类成员声明在一块,控件类型成员声明在一块,同组功能的方法声明在一块;

9、一个函数体不要超过50行、功能要单一,不杂交耦合,内聚度越高越好;

10、一个类的声明不要超过200行、功能尽可能单一、尽量减少组合模型式扩充,保证耦合度越低越好;

11、一个cpp实现体不要超过2000行、若超过,请再封装成原子操作函数进行调用;

12、每个方法声明处必须有注释,重载方法必须说明区别、注释量占代码量20%~30%为佳;

13、数值型常量、少用宏定义,多用const定义;精度允许范围内、能用整形类型的,尽量少用浮点型;

14、分支型处理、少用宏开关分支,多用switch分支;类层次间的多用虚函数代替switch选择;

15、if/else不要层层嵌套太深,能抽出来尽量抽出来,保证代码可读性;

16、为提升性能、形参尽可能用引用类型或指针类型、返回值是对象的更应如此;

17、为提升性能、在预知最大数量的情况下,尽量用固定大小数组代替动态增容的容器类对象;

18、为提升性能、查找性能要求高的、尽量建立map或hashmap,删除和插入性能要求高的、尽量建立链表;时间复杂度和空间复杂度须考虑;

19、为提升性能、不搭边不干涉的多个功能同时跑时、建议创建多个线程平行处理;

20、为提升性能、尽量减少内存管理器和内存拷贝函数的调用;(备注: 它们一个函数的底层实现机器指令数量、比一般函数多许多倍);

21、为提升性能、少用字符串对象,因为它会复制/拷贝/创建/销毁,每一步都跟上一条有关,每一条指令都比普通指令多几十倍的机器指令数;

22、为提升性能、多重循环尽量编写成单重循环;

23、为提升性能、对于无法避免的且必须多重循环的,循环量最大的放在最内侧,以提高在高速缓存中的命中率、减少CPU在内存与高速缓存之间来回加载/切入次数,毕竟内存与CPU高速缓存R/W速度相差几个数量级;

24、为提升性能、尽量减少I/O操作,在内存中操作、毕竟I/O操作与内存操作又相差几个数量级;

25、为提升性能、能使用顺序存储数据结构的就尽量不要用非顺序存储数据结构,因为非顺序存储的读写周期是顺序存储的读写周期的许多倍;

26、为提升性能、能一次读取多字节的,尽可能大的一次性读取,让主机可能的对齐式内存访问;切记不要一次读一个字节,因为非对齐内存访问效率极低;

27、为避免卡顿僵死、不允许在Command事件的Handler里编写运行耗时超过100ms的处理、阻塞了UI线程的消息循环;

28、尽量在变量定义的时候就赋予初始值、避免使用时忘记赋初值;

29、尽量在加锁的同时、写好解锁语句、避免忘记解锁导致死锁;

30、尽量在new或malloc的同时、写好free和delete、避免忘记导致内存泄漏;

31、尽量在LoadImage等加载资源地方的同时、写好DeleteXXX或DestroyXXX,避免忘记而累计加载资源过多导致软件极慢甚至崩溃;

32、尽量在各项目统一基本数据类型头文件、统一枚举类型或宏定义、统一常用基本工具类、统一IDE工具、减少移植障碍、统一src版本控制工具、规范行为一致性;

33、尽量在定于结构体或类时、预留两三个成员占位符,为后期扩充做准备;

34、尽量不要在程序界面显示出来之前,做大量耗时处理,避免给用户双击无效的错觉而拼命双击、显示出来之后初始化并提示;

35、尽量不要主UI线程中做初始化动作,阻塞了UI的消息循环,给用户界面僵死卡顿等不友好体验UFUE;

36、对于共享资源,请做好原子性操作的同步措施,对于共享基本变量,请使用原子操作函数或者定义原子变量或寄存器变量,避免[高速缓存<->内存]回写时间差中被另一线程读取/篡改;

37、单进程空间中、允许创建的内核对象和GDI对象数量极为有限、用户态内存也极其有限,请在创建时就写好释放代码,避免对象数量上升导致软件卡顿、久之闪崩;

38、对于大的单资源对象,尽可能只加载一份共享,而不要每个窗体都加载一遍,因为单进程内存容量十分有限,同时OS一直在帮助进程在高速缓存<->内存<->虚拟内存(硬盘)之间进行内存管理,对命中频次低的不用资源的回写、当使用时又加载回来。这是当许多资源只加载不释放,达到一定数量之后、软件会变得异常慢的底层原因之一。

39、当需要频繁使用内存管理时,请创建内存池,进行内存复用,减少内存的动态申请/销毁的及其碎片重整;

40、当需要频繁使用线程时时,请创建线程池,进行线程复用,减少线程的动态创建和销毁的开销;

41、当需要提高产出效率时,请创建多线程并发,进行时间复用;

42、杜绝挖坑设计、杜绝误导性注释、

43、尽可能减少项目易手,保证需求完整性、减少需求信息的传递损失、保证代码纯洁性及稳定性;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌志辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值