主页

C++ 开发推荐tips

为了减少不确定性,固定时延,避免内存使用的不确定性,以下是一些推荐做法。 1.mlockall() 锁定内存 调用mlockall()在初始化时锁定进程的虚拟内存,包括代码段、数据段、堆和栈,防止不确定的内存回收。 内存回收是可能会把只读映射的代码段区域回收掉,用到时再触发异常,重新从文件系统加载,重而引入了不确定的延迟。 mlockall(MCL_CURRENT | MCL_FUTURE ) 这可以防止代码段意外回收后重新加载造成的不确定延迟。 注: 对于链接了多个库的大型应用,可以只锁定关键代码区域。 另外一个手段,初始化时malloc一块大内存,mlock住,再释放掉,后面再有malloc不再产生缺页中断。 2.malloc libc中的malloc函数,...

阅读更多

c++ advise

c++ vector指定大小,直接用下标而非pushback 指定大小,避免vector在添加新元素时频繁重新分配内存和拷贝数据。 每次只使用push_back添加元素,vector会频繁的重新分配内存并拷贝数据来维持连续存储,影响效率。 用emplace back替代pushback push_back在添加元素时,需要先构造元素,再移动或拷贝到vector的末尾。 而emplace_back直接在vector末尾构造传入的参数为新的元素,避免了拷贝或移动构造的开销。 所以当添加自定义类对象到vector时,使用emplace_back可以提高效率: 用乘法代替除法 用& 代替% int x = a / b; // 乘法运算 int x = a * (1.0/b...

阅读更多

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 CV 比较

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) ...

阅读更多