语法使用优化(c++)

来源:互联网 发布:广州网络咨询招聘 编辑:程序博客网 时间:2024/05/19 09:12

记下一些常用的c++语法用法优化。基本上对c++程序程序通用(环境linux,支持stl)

(1)循环使用减法替代加法。减法是一条汇编,加法是两条汇编。

(2)循环写法如:for(int i = size-1 ;i>-1;--i)不用>=0 而用>-1

(3)尽量不要使用string,string要生成对象,尽量使用char数组来代替。

(4)配置的数据尽量使用数组(或vector)来代替map,数组的访问是常量级别的,map的是哈希表查找的(访问的速度是数组大于map,map大于list)。

(5)vector的使用时,可以使用vector的data()方法来获取数组的指针使用,能减少迭代器访问。

(6)常插入的使用list,访问多的使用vector。使用vector成员前可以考虑先预留空间。

(7)尽量使用自己写的容器,容器的拷贝多使用memcpy,memmove等函数(当必须使用到内存拷贝时),这些函数是经过汇编优化的。

(8)在函数里面要是常使用到一个变量,就把他作为静态的(或者缓存到成员变量,其访问速度更快),可以减少对象生成。

(9)字符串连接可以尽量使用sprintf(或者snprintf ),他会返回格式化的字符串的长度,然后char* 指针就移动这个长度后继续使用(别忘了最后设置0 啊,snprintf 则不用),这也是不使用string的操作符如+号的原因,消耗是很大的。

(10)尽量减少函数的调用,函数的调用要压栈,通常还需要拷贝数据。比如通常比较多的做法是使用单例 instance() 来返回一个该函数里面静态的变量或本文件全局的静态的变量,这样就会出现一次函数的调用(而且写起来也比较长哈),可用的做法就是作为一个全局的变量(需要在头文件添加extern声明)

(11)可以多使用些位操作。 标记是2 的倍数,使用 | 给一个unsigned int 的标记记录(flags)添加 标记,使用&标记来判断,使用  & ~ 来取消标记。处理器是有支持位操作的指令的。

(12)使用容器遍历时,也要记得把第一个和最后一个迭代器取出来再使用。

(13)当多次要取一个数组的下标时,先把该数先取出来再使用。如     b =   a[i],再使用b

(14)针对原子类型的多线程操作使用原子操作。比如windows下的Interlocked系列的函数(InterlockedExchangeAdd等),linux下的__sync_系列的函数(__sync_fetch_and_add,__sync_fetch_and_sub等)

(15)能使用成员函数或成员变量的 就不要使用全局变量或全局函数。

(16)线程间数据通信使用两个队列来缓存,使用时交换队列指针(需加锁)。

(17)注意字节对齐优化,一般64位linux系统GCC 默认字节对齐是8字节,32位系统是4字节对齐,写c++代码时可以在后面补字节成员。需要网络通信和写数据库的结构体一般会1字节对齐,则无法字节对齐优化。

(18)vector删除数据最好从后面开始删除。

(19)单线程内,使用static 的变量来减少重复申请内存,也常用在函数内,可避免命名污染和看起来方便。

(20)能使用--操作符的地方,在不影响结果情况下使用前置--操作符。如for(int i = size ;i>-1;--i). 使用后置--和后置++ 会申请临时栈内存。

(21)不需要修改的成员变量和不修改this指针的函数都加上const,这样一些编译器会把该变量放入寄存器。

(22)函数返回只读对象时,尽量返回常量指针,返回引用可能有的使用者没注意在外面加上&引用号,则造成内存拷贝。尽量不返回大对象,如有需要则传入对象引用或指针作为函数参数。

(23)计算对象内存大小时,若是class A 的对象a,使用sizeof(a)而非sizeof(A),否则类型修改时需要增加修改的地方的个数。

(24)在局部多次使用某结构的某成员,应先获取其指针或者引用来使用。

(25)在对象自己的函数内访问自己的成员时,直接访问,不通过函数,除了多重继承的父类成员。

(26)遍历删除map成员:for(;it != mymap.end();){if(condition)mymap.erase(it++);else ++it;}           说明:erase函数的参数是it的缓存,在进入erase函数之前迭代器it已经进行了++操作。(stl源码书推荐方式)

原创粉丝点击