1. 对齐原则。比如64位总线,每次寻址读取8B。编程时注意变量地址,尽量消耗总线最少的寻址次数。堆内存申请时,系统严格按照对齐原则分配,故而使用时候也尽量不要跨寻址边界。

2. 需要的时候,可为了效率拷贝代码,虽然增加了代码体积,但这是值得的。尤其是for循环,若次数比较少,拆开亦无妨。

3. 位运算中,-1右移,左边补1,故仍为-1;-1左移,右边补0,故不再为-1。

4. 每次申请的堆内存,最好初始化,里面是垃圾数据,而并非为空。

5. 项目开发中,往往一个引擎对外暴露的是一个纯虚类,而其接口就是这个类的**指针变量。

6. 程序逻辑,重在语义。不能为代码的过分简单而减少函数的设计。

7. *&表示对指针的引用。

8. 类的静态方法不可调用其非静态方法,亦不可调用非静态成员变量。

9. 多文件编程时,头文件不可相互包含。

10. 头文件里尽量不要使用using namespace std;

11. static成员定义要放在cpp文件里面,而不是头文件里。

12. 纯虚类尽量不要延续两层以上。

13. include引用尽量都放在cpp文件里。

14. 子类继承父类,不可在构造函数里初始化父类并未在构造函数里初始化的成员,也就是说,子类构造函数里能初始化的成员,只有自己本身的和父类构造函数里的。

15. 项目开发中,对于一些依赖本地环境的参数,要写专门的配置文件,比如服务器地址。

16. 头文件里只声明,不定义。在头文件中,全局变量声明,必须加extern修饰;静态成员变量声明放在头文件,定义放在cpp文件,若是普通静态变量,最好声明和定义放在cpp,因为static作用域限于单文件,放在cpp里只对本文件可见,放在头文件会被所有引用该头文件的cpp拷贝一份完全相同的变量。

17. linux下,进行文件操作时,文件路径要采用绝对路径(相对路径很多时候会出bug),文件指针要对其返回值作判断,防止空指针。

18. debug状态下使用assert是极好的,不过记得发布版本前在#include <cassert>前加上#define NDEBUG,assert语句会被NDEBUG所影响。这里多嘴一句,错误与异常是不同的,异常是不可避免,在发布版本里不可或缺的,故而assert不能用于处理异常。注:在加上#define NDEBUG后,不论是调试还是运行,assert语句都会被直接忽略,故而平时开发时把#define NDEBUG注释掉,发布时再启用它。

19. 面向对象编程:可维护,可复用,可扩展,灵活性好。

20. 频繁使用的代码里,尽量少使用容器,因为其创建和回收的开销很大。

21. 字符串拼接效率:经过测试(http://bbs.csdn.net/topics/360000434和我自己项目中的实验),memcpy效率最高,string类的+=效率特别高,足以满足日常所需,而strcat效率很差,append也不快。

22. 基类中的虚函数要么实现,要么是纯虚函数(绝对不允许声明不实现,也不纯虚)。

23. 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static。

24. 当多个线程访问同一个类静态方法时,若该方法里只操作栈上数据,则无妨,因为线程的栈是独立的;若该方法操作了非栈上的数据(比如堆、全局变量等),则需要互斥锁。

25. 内联函数,定义体要放在头文件,以保证每一个引用该头文件的cpp里都是完全相同的拷贝;inline关键字置于定义前,不必放在声明前;若定义在类内部,可不需要inline关键字。

26. vector执行clear时,会自动调用元素(如果是类的话)的析构函数。

27. 编程时,对变量(尤其是全局性质的变量或类)命名,要用解释性的,而不能用随意的j1,i1,n,m等名称,容易与库里的变量冲突。

28. 定义宏时,尽量多用整数,少用-1,-2之类,容易受uint和int不统一带来的困扰。

29. 函数形参采用默认值时,要写在声明里,而不写定义里,这样方便调用其头文件的cpp看得到默认值。

31. utf-8 中文编码 三个字节表示一个汉字

32. 项目开发时,使用条件编译:

#define DEBUG
main()
{
#ifdef DEBUG
printf("Debugging\n");
#else
printf("Not debugging\n");
#endif
printf("Running\n");
}

发布版本时,注释掉第一行。这种方式要比开大量注释来得方便。

33. 关于c字符数组,需要注意一个初始化问题:

() char str[]="";
() char str[]={'\0'};
() char str[]; str[]='\0';

前两者的意义在于str的每个元素都初始化为'\0',第三者仅仅初始化第一个元素。当数组长度很大时,前两者时间开销极大。故而,有些不必要的时候,不要如此初始化。

34. 判断一个字符是否为数字:

头文件:#include <ctype.h>
定义函数:int isdigit(int c);
函数说明:检查参数 c 是否为阿拉伯数字0 到9。
返回值:若参数c 为阿拉伯数字,则返回true,否则返回null(0)。
附加说明:此为宏定义,非真正函数。

#include <ctype.h>
main(){
char str[] = "123@#FDsP[e?";
int i;
for(i = ; str[i] != ; i++)
if(isdigit(str[i]))
printf("%c is an digit character\n", str[i]);
}

35. 在类里声明静态常量,尤其是数组定义的时候,如static const *str = "sdfsssf", 要在const前加上constexpr修饰,可以在编译器就将“sdfsssf”赋值给str,达到类似宏的效果。

36. std::string::find_last_of("/\\") 这里的"/\\"指的是'/'或'\',在搜索字符时用得到。

37. 项目里c字符串传递,多采用首地址+长度的方式,避免0x0存在导致的异常; 线程数要合适,大致为cpu总核数两倍以内为佳,线程间切换会一定程度上消耗程序性能。

  有一个陷阱是在c字符串转string类型时,c字符串里如有0,转化时用strlen取长度就会出错。故而,c串表示尽量维护一个len来记录长度,而不是通过结尾0来判别。另外,strlen效率低且不安全,少用。

38. 静态函数的实现写在h文件里;尽量把h文件里的函数实现前都加上inline,不论其复杂度,避免被多文件引用而引起重复定义错误。

39. 静态成员变量必须在类外进行初始化。如果是复杂类型,比如容器,也要在类外定义,如std::vector<xx *> hj::sm_tr;

40. 编程时,一般结构体里的堆内存由内存池管理申请或释放,或者stl里使用这些结构体作为元素时,使用其指针,而不是实例。因为stl里内存申请或释放,会调用其元素的构造和析构,这里会有陷阱。

41. 使用set、map时,有一个陷阱,就是[]操作符。当使用这个操作符时,如果[x]里的x并不在set或map里,则stl会自动生成一个x元素,这样使得stl容器内容改变,如果开发者忽略了这点,后果可能无法预期。

C++编程优化心得(持续更新)的更多相关文章

  1. js函数式编程术语总结 - 持续更新

    参考文档1 参考文档2 函数式编程术语 高阶函数 Higher-Order Functions 以函数为参数的函数 返回一个函数的函数 函数的元 Arity 比如,一个带有两个参数的函数被称为二元函数 ...

  2. sql语句优化(持续更新)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引 ...

  3. source insight 编程风格(持续更新)

    1.字体Source Code Pro 出身于豪门Adobe,从名字上来看就知道是转为编码而生的.基本上也是拥有前面所提的编程字体的所有要素的.这个字体基本上具有编程字体所需的所有要素:等宽.支持Cl ...

  4. java编程规范(持续更新)

    1:非空判断 错误例子: if(user.getUserName().equals("hollis")){ } 这段代码极有可能在实际运行的时候跑出NullPointerExcep ...

  5. 养成良好的C++编程习惯(持续更新)

                    c++语言的灵活是建立在对编程者个人的编程素质的严格要求基础上的,好的C++编程习惯能避免很多问题. 没有好的编程习惯,极有可能编写一行代码,编译器能报十几个错误,而且 ...

  6. iOS Debug心得 (持续更新)

    最近在维护一个内部比较混乱的APP,Debug的时候遇到很多比较痛苦的地方, 因此做一个Debug记录,对以后的开发会有比较大的帮助: 这样,在开发新项目的时候就可以争取把一些BUG扼杀在襁褓中. & ...

  7. linux使用心得(持续更新)

    ! 查看发行版本信息 lsb_release -a uname -a   以下方法只适合redhat和centos cat /etc/redhat-release rpm -q redhat-rele ...

  8. C#编程思想(持续更新)

    1.将约束的参数先用变量保存,一定不变的设为const,在使用时不直接填入数字而是使用这些变量,这样可以很大程度上方便后续参数的修改 2.字段先用属性封装后,所有的调用都使用属性而不是字段 3.要返回 ...

  9. Vue 项目优化,持续更新...

    一.减少打包的体积 通过vue-cli 初始化项目后,使用 npm run build 生成的JS文件往往会很大,加载时间过长导致页面长时间白屏,所以我们尽可能的使用一下方法来减少打包体积. 1.1 ...

随机推荐

  1. opencv的学习笔记3

    CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目.通过编写CMakeLists.txt,可以控制生成的Makefile, ...

  2. CentOS7下安装Mysql和Memcached 以及 使用C#操作Mysql和Memcached

    我本身是学.net的,但是现在很多主流SQL和NOSQL都是部置在linux下,本着好学的精神,前段时间装了个虚拟机,在其装上CentOS64位的服务器系统,对于英文0基础,linux0基础的我来说, ...

  3. Objective-C语言分类与协议

    分类(Category)允许向一个类文件中添加新的方法声明,它不需要使用子类机制,并且在类实现的文件中的同一个名字下定义这些方法.其语法举例如下: #import "ClassName.h& ...

  4. UICollectionViewDelegateFlowLayout 使用

    import UIKit //UICollectionViewLayout //itemSize属性 //设定全局的Cell尺寸,如果想要单独定义某个Cell的尺寸,可以使用下面方法: // - (C ...

  5. 怎么在php里面利用str_replace防注入

    <php    /**    * 安全过滤函数    *    * @param $string    * @return string    */    function safe_repla ...

  6. js页面刷新之实现定时刷新(定时器,meta)

    测试页面的代码见上一篇博客 接下来进入正题-定时不断刷新页面的方法: 1.看到定时,很容易想到js的定时器: //第一种方法 //由于我们已经有了一个定时器,所以只要在定时器test中加入一句刷新页面 ...

  7. selenium—JS点击方法

    package com.allin.pc;import java.util.NoSuchElementException;import org.openqa.selenium.By;import or ...

  8. CentOS 下开启.htaccess

    一般来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以帮我们实现: 网页301重定向.自定义404错误页面.改变文件扩展名.允许 ...

  9. 跨站脚本 XSS<一:防御方法>

    1. 过滤特殊字符 避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤: PHP的htmlentities()或是htmlspecialchars(). Pytho ...

  10. linux 下安装安装rz/sz命令

    一.软件安装 root 账号登陆后,依次执行以下命令: cd /tmp wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz http:/ ...