c++基础
文章平均质量分 80
Duco
只存在于stash的代码
展开
-
一个基于c++11的多线程池实现(std::thread)
需求分析任何一个对性能有所要求的程序中,多线程是个绕不过去的优化手段。直接使用多线程并不能完全的发挥其作用。假设某个算法的pipeline有N个模块M1,M2,M3,M4…MN。首先若直接使用多线程技术,会导致我们在每个模块中都要重复一遍创建线程的操作,从而影响总体性能。其次在这种重复创建线程的情况下也有可能会导致线程进入睡眠状态,而无法快速的利用CPU资源。所以由线程池统一的安排线程创建和调度就显得很有必要。再考虑更复杂点的情况。M1到M5是需要多线程来加速,M6到M10不需要,随后M11到16原创 2021-07-19 15:25:38 · 1336 阅读 · 10 评论 -
C++框架设计 【2-更优雅的创建对象】
任务上一章中我们是用下面的代码来完成对象的创建的。这段代码并没有什么问题,每次新增一个层的时候在此处添加即可。不过还是可以有更优雅一些的实现。LayerBase *LayerFactory(string classname){ if (classname == "conv") return new LayerConv(); else if (classname == "pooling") return new LayerPooling(); else if (classname == "原创 2020-05-21 08:36:42 · 392 阅读 · 0 评论 -
C++框架设计 【1-加载CNN模型】
用到的设计模式:1.工厂模式。根据层的类型创建对应的对象。2.策略模式。固化运行网络流程中固定的部分。不用json用用test为了没有依赖库原创 2020-05-18 23:30:17 · 817 阅读 · 0 评论 -
C++框架设计【0-开篇】
为什么要设计不得不说对程序员来说这是个好时代。即使国内的程序员保质期时间不比国外,且总是绕不过诸如““”996”这样的话题。但是总的来说这确实是个好时代,因为开源已经成为一种潮流。对新人来说,可以用“轮子”来解决自己遇到的问题,还可以单纯的学习大神们的杰作来提升自己的能力。对高阶的程序员来说,参与大型开源软件的设计和开发或者有自己发起的广为人知的开源软件,既可以给自己在业内提升知名度(在这个流量、眼球经济时代似乎没有什么比此更重要的收益了)又能满足程序员们自身对想要做点什么牛逼的东西的渴望。至于各类拥抱原创 2020-05-18 23:25:26 · 861 阅读 · 0 评论 -
在C/C++项目中合理使用宏
C++项目中常使用宏来做跨平台、功能实现隔离、变量定义的功能,这篇文章来讨论下是否所有情况下都适合用宏小D的故事程序员小D接到一个任务,需要给同事A提供一个复杂公式的实现。输入为一组参数,输出一个计算结果。大致如下:double computeSomeThing(double paramA,double paramB,double paramC);小D很快完成了。过了几天同事A又来找他,...原创 2019-10-12 18:11:00 · 1434 阅读 · 0 评论 -
一个基于Memory Pool的图像算法内存池实现
动机在实现图像类工程应用中,往往需要一些临时的中间图。若应用较为简单可以固定一些image buffer,反复利用这些内存来达到避免内存碎片和节省内存申请的时间。但业务流程较为复杂时,还是需要内存池来帮助管理这部分内存。大致搜索了一下现有的内存池,其中boost的四种内存池显然不符合我在这里提到的需求。我希望的是可以存一些图像的中间结果,可能是小图也可能是大图,是不定长的且内存的需求量较多。...原创 2018-08-12 13:54:49 · 544 阅读 · 0 评论 -
用SSE做NEON仿真
想用NEON接口实现SSE,可以使用一套用SSE实现的NEON接口。下载地址: https://software.intel.com/en-us/blogs/2012/12/12/from-arm-neon-to-intel-mmxsse-automatic-porting-solution-tips-and-tricks 在下载NEON_2_SSE后放到VS2013上进行编译。出现两个错误。...原创 2018-07-10 16:44:22 · 2152 阅读 · 4 评论 -
c++中仿函数的理解
先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样:1 bool LengthIsLessThanFive(const string& str) {2 return str.length()<5; 3 }4 int res=count_if(vec.begin(),原创 2016-11-11 17:47:25 · 4370 阅读 · 3 评论 -
auto_ptr 和 STL容器的冲突与陷阱
上个星期的博客shared_ptr源码剖析里其实遗漏了一个问题:为什么auto_ptr不可以作为STL标准容器的元素,而shared_ptr可以? 我在网上看了好多篇讲shared_ptr的文章里讲到了这个问题,不过大多文章只是简单两笔带过。我研究了一下这个问题,发现还是有挺多有价值的内容,所以把这个问题单独成一篇博客和大家分享。先从表象上看看这个问题,假如有这样的一段代码,是否能够运行?int转载 2017-09-09 21:48:51 · 671 阅读 · 0 评论 -
c++模板偏特化的应用
动机考虑这样一个需求, 在某项目中需要对动态内存进行限制以避免产生内存碎片这样的问题,需要实现一个内存池。让项目中的一些对象在内存池中拿取数据而不是直接用new在堆中取数据。那么对于一个对象的生成我们需要把内存分配和构造分开,同样的析构和内存收回也需要分开。对于前者,我们可以使用placement new来完成。后者则显式的调用析构函数。讲到这里就有一个问题,自定义的结构体和类是有析构函数的,但是原原创 2017-09-09 21:09:27 · 567 阅读 · 0 评论 -
C++中如何实现自定义类型的迭代器
我们知道STL实现了很多算法,如果项目是基于STL构建那么能够最大化使用现有代码当然是最好的。在STL中容器和算法之间的桥梁是迭代器。所以在定义好自定义类型的容器后,接下来就是迭代器的实现。STL中的迭代器迭代器模式是一种经典的设计模式,而STL的迭代器实现用到了模板的一些特性和技能,其中的细节可以去参考《STL源码剖析》里面的内容,在这里稍微介绍一下下面是STL中结构体iterator的定义,原创 2017-08-09 20:05:49 · 18006 阅读 · 0 评论 -
C++ RTTI的简单实现(二)
前不久写了个 C++ RTTI的简单实现(一) ,是在查了一些RTTI资料后自己倒腾出来的。近日重看(一两年前看的忘的东西挺多的)《深入浅出MFC》,看到候老师关于MFC六个仿真中的RTTI实现,对比了下自己的设计,下面总结一下。相同点整体的宏定义很类似,一个静态变量,一个虚函数返回真实类型。超级父类的特殊处理。不同点数据结构 MFC中用的是单链表,采用头插法建立链表。结构体内有三个指针:一个静原创 2017-05-15 14:32:25 · 820 阅读 · 0 评论 -
C++ RTTI的简单实现(一)
动机为了加深对RTTI的理解,尝试实现了一个RTTI系统。不过做的比较简陋,功能如下1.只支持单继承体系2.系统必须有个超级类,作为一切类的最上层父类3.手动添加MY_RTTI和END_SUPER_DECLARE_CLASS宏4.实现了动态造型(dynamic_cast)介绍typeID的识别利用虚函数实现,利用虚函数的性质可以让对象输出真正的类型标志,而不会被其声明的类型所改变。为了安全原创 2017-04-29 12:38:19 · 1221 阅读 · 0 评论 -
【c++基础】虚函数的使用以及和成员函数的区别
前言一直以来都知道虚函数的经典用法,但是除了本科时刚学c++的时候了解过,后来因为做不同的项目在不同的语言之间跳转(自觉都是浅尝辄止),这些基本的东西都忘记了,现在重拾并记录,权当巩固基础了。经典用法#include<iostream>using namespace std;//几何体类class Geometry{public: virtual void draw(){原创 2016-11-01 14:11:59 · 2994 阅读 · 1 评论 -
【深入理解C++11 笔记】——1 保证稳定性和兼容性
静态断言 static_assert关于断言的个人理解先说一下为什么要使用断言。在第一次见到断言时就很疑惑,为什么要使用断言,比如指针为NULL(assert(ptr!=NULL) ),可以先判断是否为NULL然后返回嘛,可以用异常机制包起来嘛。目前的理解是断言就是为了检查源码逻辑而存在的,跟其它检错机制有些目的上的差别。比如在一个类中写了一个mynew()函数,和一个mydele原创 2016-05-09 21:33:56 · 869 阅读 · 0 评论