主页

c++ guide 头文件

头文件相关的c++ guide 头文件要Self-contained 头文件要能够自给自足,即 self contained, 头文件本身以来的其他头文件,需要全部包含 也就是说,需要保证 在包含该头文件后,出于易维护性考虑,可以不需要引入其它头文件,就可以保证编译通过 例如 // foo.h #ifndef FOO_H_ #define FOO_H_ // print_str 接口中的入参是 string 类型 // 所以要求在 这加上 头文件引用 #include <string> void print_str(const std::string& input); #endif // A_H_ 保证引用foo.h 的地方不用添加 #include...

阅读更多

atan2 优化

性能分析 火焰图发现std::atan2 存在平顶 性能优化 之前用的std::atan2 性能不理想,项目中已经有opencv库,查阅资料cv::fastAsan2 更快,具体参考 https://blog.csdn.net/u014629875/article/details/97817442 https://blog.csdn.net/lien0906/article/details/49587759 性能对比 cv::fastAtan2比std::atan2快约2.6倍 在cv::fastAtan2的基础上,使用neon加速3.2倍[带宽x4]; 相对原方法std::atan2优化8.5倍左右 精度对比

阅读更多

虚函数表与虚函数指针

虚函数的实现 虚函数通过虚函数表和虚函数指针实现的,但是具体是如何利用这个表和指针进行多态调用的呢? 可以思考如下问题: 虚函数指针在哪? 干什么用的? 什么是虚函数表? 表-》信息 虚函数表-》什么信息的? 有什么用? A 类 a 对象 b c 成员 a对象内存布局是什么样? 探究虚函数表 没有虚函数的类 demo.cc #include<iostream> using namespace std; class Base{ public: Base():m_base(0),m_base1(' '){}; void test() const { cout<&l...

阅读更多

c++ 的overload实现

引入 c++ 相比c有一个新特性就是overload 又名函数重载,是c++静态多态或者编译多态的实现 但是c不行, c 语言中的函数名处理 c程序在汇编过程中,编译器会收集全局符号并生成全局符号表 符号表即,讲符合与其地址一一对应的表哥称为符号表, 在汇编的过程中我们生成了多个符号表,但最后我们只能有一个符号表,所以在链接过程中要对符号表进行合并。在合并的过程中发现同一个函数出现了两次 C++的名字修饰(name mangling/name decoration) C++如何支持函数重载呢? 编译器会根据函数名和参数类型生成修饰后的函数名,每个重载函数都具有唯一的修饰名称。例如: 例如: int add(int a, int b){return a+b;} doubl...

阅读更多

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

阅读更多