深入解析C++返回值优化(RVO)和具名返回值优化(NRVO)的实现机制、编译器优化策略与最佳实践
返回值优化是什么
返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术。即删除保持函数返回值的临时对象。这可能会省略两次复制构造函数,即使复制构造函数有副作用。[1] [2]
函数的返回机制
函数返回值的传递分为两种情况:
当返回的对象大小不超过8字节时,通过寄存器(eax edx)返回
当返回的对象大小大于8字节时,通过栈返回。此处需要注意的时候,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。
在通过栈返回的时候,栈上会有一块空间来保存函数的返回值。
当函数结束的时候,会把要返回的对象拷贝到这块区域,对于内置类型是直接拷贝,类类型的话是调...
c++ 分支预测
背景知识-流水线
现代CPU为了提高执行指令执行的吞吐量,使用了流水线技术,它将每条指令分解为多步,让不同指令的各步操作重叠,从而实现若干条指令并行处理。在流水线中,一条指令的生命周期可能包括:
取指:将指令从存储器中读取出来,放入指令缓冲区中。
译码:对取出来的指令进行翻译
执行:知晓了指令内容,便可使用CPU中对应的计算单元执行该指令
访存:将数据从存储器读出,或写入存储器
写回:将指令的执行结果写回到通用寄存器组
流水线技术无法提升CPU执行单条指令的性能,但是可以通过相邻指令的并行化提高整体执行指令的吞吐量
likely unlikely
#define likely...
打开文件 open,这时候是如何调用内核的
用户空间调用:在用户程序中调用 open 函数时,会触发用户空间的库函数执行。
库函数处理:用户空间的库函数(如 C 标准库)会将 open 函数的参数进行封装,并将系统调用号(syscall number)传递给操作系统内核。
系统调用:操作系统内核接收到系统调用号后,会根据该号码确定要执行的系统调用函数(如 sys_open)。
内核空间处理:操作系统内核进入内核空间,并执行相应的系统调用函数。在这个例子中,会执行 sys_open 函数。
执行系统调用函数:sys_open 函数会执行实际的文件打开操作,包括权限检查、文件描述符分配等。如果一切正常,它会返回一个文件描述符(file descripto...
Eigen与OpenCV矩阵运算性能对比与最佳实践
Eigen Vs CV
矩阵基本运算
差异
OpenCV在x86 & arm上Mat矩阵的用float进行存储,但是计算时高于float,计算,再截断
VS
Eigen使用Matrix定义是指定的类型进行存储和计算
Eigen MatrixXf随机矩阵乘法与c++实现float矩阵乘法京都一直
OpenCV 随机矩阵乘法与C++ & Eigen 不一致
OpenCV与C++ float 强转成double 相乘再强转成foat 京都一直
OpenCV与Eigen MatrixXf cast到double进行乘法计算后强转成float精度移植
策略
Eigen使用Float进行计算(长期推荐),预计计算效率会比OpenCV计...
深入解析ARM处理器性能优化原理-流水线冒险
背景知识
cpu 流水线
一段指令的执行大致可分为取指–译指–执行–写回4个阶段,在单流水线的情况下运行如下:
取指单元
译指单元
执行单元
写回单元
时钟周期1
取指1
时钟周期2
译指1
时钟周期3
执行1
时钟周期4
写...
全面整理C++性能优化技巧,包括编译优化、代码规范、内存管理等关键实践要点
cmakelist编译的时候打开wall
对一些语法进行检查 set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -fPIC -Wall”)
类的初始化列表要按照类定义的顺序执行初始化
有返回值的函数一定要返回
size_t和int类型的比较消除
static_cast(XX)
在h文件中,用前向声明替换 头文件 对象定义成指针或引用,在cpp包含头文件
前向声明的好处 1 加快编译的速度 2 编译的时候避免互相依赖,减少头文件的暴露,在做接口实现的时候是必须的
指针统一用智能指针,不用裸指针进行new delete操作
提供单例的宏对象展开
#define DECLARE_SINGLETON(classname) ...
c++ 性能优化资源
链接
类别
推荐理由
业务可用性
https://www.brendangregg.com/perf.html
性能分析工具
linux perf大佬brendangregg官方网站
⭐️⭐️⭐️⭐️⭐️ 强烈推荐
https://perfetto.dev/
性能分析工具
Android和Chrome内置性能分析平台
⭐️⭐️⭐️⭐️⭐️ 强烈推荐
https://github.com/google/benchmark
Benchmark
Googl...
C++ Conan包管理器入门指南:依赖配置与使用实践
1. conan 的建议
https://docs.conan.io/1/cheatsheet.html
版本控制、修订记录和依赖解析应该在整个公司保持一致。
所有开发者的配置需要保持同步,尤其是软件包id计算模式。在CI/CD系统中,应该始终使用lock文件,以保证构建的可重现性。
2. conan的配置
设置settings
https://docs.conan.io/1/reference/conanfile/attributes.html
class HelloConan(ConanFile):
settings = {"os": ["Windows"],
"compiler": {"Visual Studio": {"version": [1...
共计 128 篇文章,16 页。