C/C++ 性能编码技巧
一些初步性能优化的思路,
后续可更新相关代码案例,点赞收藏啊喂
原则:
多优化hot代码,多考虑八二原则
容器
避免动态内存分配
使用vector.reserve()进行初始化
强行在栈上分配
容器一般默认在堆,可使用std::pmr::monotic_buffer_resource
map遍历
使用auto&代替std::pair,后者可能会产生隐式拷贝
map添加/修改
使用operator[]再key不存在时会调用两次构造函数,解决:先判断是否存在,再做插入
map构造
std::piecewise_construct,只构造一次,没有多的移动和拷贝构造函数
迭代器
使用++iter
容器查找
优先用成员函数find,而不是std::find
容器拷贝赋值
标准库都是值语义,改为使用移动语义
容器添加
emplace_back代替push_back
IO相关
文件写入
不高频率调用write,不一次写入、删除大文件,少使用du遍历
输入输出
libfmt代替原生printf
类与对象
移动构造函数
要定义为noexcept性能优化
类的成员
用初始化列表构造能减少构造函数调用
变量定义
使用前再定义,防止过早自动调用构造函数
智能指针
可使用unique_ptr代替裸指针,勿滥用shared_ptr,会影响影响,引用计数器是原子操作
用make_shared代替new创建shared_ptr
默认函数
手动删除不需要的构造函数、析构函数、隐式构造转换,运算符重载
编译优化
内联函数
3行左右,写在头文件,lambda自动内联
复制省略
RVO,NRVO,不要用return std::move(xx)
短字符串优化SSO
字符串直接保存在栈上
编译等级
编译等级需要设置为O2以上
其他
auto无引用
auto不会自动推导引用&
字符串
字符串不用+用+=,比如s1+=s2,而不是s1 = s1+s2
循环体外创建string,内部用clear代替直接创建string
const char*转string,比如"SevenX"是一个const char* ,如果函数形参是string就会调用隐式转换
赛文の后花园 文章被收录于专栏
赛文X让你重拾信心!