语法使用优化(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源码书推荐方式)
- 语法使用优化(c++)
- 使用WITH语法优化SQL一则
- Objective-C语法之KVC的使用
- Objective-C语法之KVO的使用
- Objective-C语法之KVO的使用
- Objective-C语法之Category的使用
- Objective-C语法之KVC的使用
- Objective-C语法之KVO的使用
- Objective-C语法之Category的使用
- Objective-C语法之KVC的使用
- Objective-C语法之KVO的使用
- Objective-C语法之KVO的使用
- Objective-C语法之KVO的使用
- Objective-C语法之KVO的使用
- Objective-C语法之NSString使用详解
- Objective-C语法之KVC的使用
- Objective-C语法之KVO的使用
- Objective-C语法之KVC的使用
- VC打开多个文件对话框
- 32位模式下C/C++程序可用最大内存
- S5PV210(TQ210)学习笔记——内核移植与文件系统构建
- 判断文件结束有两种方法:EOF和feof()
- LA - 3026 - Period(KMP)
- 语法使用优化(c++)
- 【科学如此奥妙】20张动态图揭秘机械的神奇原理
- mac os shell脚本hello world
- Memory:DRAM SRAM PROM EPROM EEPROM FLASH 区别 定义
- JadePool应用范例:完善China软件项目架构(一)
- Pyside-uic问题
- 【创新中国】91金融超市:打造简简单单的线上金融超市
- 快鲤鱼研报:健康导航应用ZocDoc
- Pass by value & pass by reference