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让你重拾信心!

全部评论
还得是我的赛文
1 回复 分享
发布于 2023-08-27 21:35 上海
多发点,我爱看
1 回复 分享
发布于 2023-08-28 03:10 江苏
谢谢你赛文
1 回复 分享
发布于 2023-08-28 10:32 陕西
让我们说谢谢海投王
1 回复 分享
发布于 2023-08-28 13:35 广东
赛文哥,使用operator[]再key不存在时会调用两次构造函数,解决:先判断是否存在,再做插入。 这个两次构造函数指的是哪两次? key一次,value一次吗?
1 回复 分享
发布于 2023-08-28 22:21 北京
"循环体外创建string,内部用clear代替直接创建string"。Linear in the size of the string, although existing implementations operate in constant time. 感觉得看具体string的实现,如果clear是O(n)的话,其实和内部每次创建差不多。
1 回复 分享
发布于 2023-08-28 22:27 北京
这个「循环体外创建string,内部用clear代替直接创建string」和这个「如果函数形参是string就会调用隐式转换」是啥意思
1 回复 分享
发布于 2023-11-07 23:13 北京

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
一个非常好用的遍历方法
AomaYple:不是指针,是引用
点赞 评论 收藏
分享
评论
28
108
分享
牛客网
牛客企业服务