![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 62
C++
Blizzard_v
An explorer
展开
-
RAII+接口模式下的生产者消费者多batch实现以及封装
RAII(Resource Acquisition Is Initialization),也称直译为“资源获取就是初始化”。这里的生产者消费者指的是模型推理的过程,原创 2022-11-11 16:30:52 · 211 阅读 · 0 评论 -
使用RAII+接口模式对模型加载和推理进行封装
infer.hpp头文件:这个时候你会发现这个头文件里只依赖了最简单的东西,这里就只有memory,string很常见因为基本都要包含,所以直接无视。能做成这样的原因是因为实现真正功能的类(class InferImpl)里的那些很多成员变量在infer.hpp头文件这里是没有被暴露出来的。为了帮助理解这一点,我举个例子,就是对应下面代码注释掉的地方。原创 2022-11-10 18:04:32 · 703 阅读 · 0 评论 -
生产者消费者模式promise、future、condition_variable
同步调用(同步就意味着一个一个挨着执行,执行完了下一个再执行,所以同步是指都放在一个线程里)还有一个很大的缺陷就是对这个线程的承载是非常重的。当调用你这个线程执行你算法的操作时,如果太重了就会使得性能比较差,因为你的线程上下文是需要初始化的,你的线程里有很多内容是需要分配资源的。所以如果我的调用的逻辑跟你的推理的逻辑不在一个线程里,就会使得调用非常轻便,性能非常好,接口也更加简单便利。原创 2022-11-09 21:27:22 · 474 阅读 · 0 评论 -
C++多线程
【代码】C++多线程。原创 2022-11-09 19:09:04 · 155 阅读 · 0 评论 -
C++编译过程中“undefined reference to“ 问题的解决方法
于是我更换检索方法,只检索这个类型的报错信息即“undefined reference to“ ,了解报错原理,这一般是由于链接时找不到对应的库报的错误,于是我参见了以下这个对问题原理的解释,发现是链接时找不到库的原因,库一般都保存在/usr/local/lib路径下,所以我将这个路径加入环境变量后就解决了问题。这次报错的解决也让我意识到解决报错的一种方法,我们不要盲目得复制粘贴报错信息去google检索,有些详细的错误是google不到的,要查得应该是。而且最好是能用一些测试代码来复现出这个错误。原创 2022-11-07 16:13:44 · 6273 阅读 · 0 评论 -
gdb调试参考资料
以gdb启动程序,gdb只能调试CPU,而要想进入GPU则需要使用cuda-gdb2、进入gdb后,输入命令:‘r或run’,执行程序,注意不能输入启动命令后就直接next,要先打断点再run,如果不打断点程序就直接跑完。原创 2022-09-21 12:51:29 · 144 阅读 · 0 评论 -
C++中 extern “C“ 用法详细说明
与函数定义“int method(){}”可以很清晰的区分开来,为了简便起见,可以把extern关键字省略,于是有了我们常见的函数声明方式“int method();”,然而对于变量并非如此,变量的定义格式如“int i;在C++源文件中的语句前面加上extern “C”,表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。为了声明一个变量而不是定义一个变量,你必须在声明时指定extern关键字,但是当你又加上了"C",它不会改变语义,但是会改变它的编译和连接方式。原创 2022-09-19 18:09:35 · 669 阅读 · 0 评论 -
/usr/bin/ld: cannot find -lxxx 的解决办法
LD_LIBRARY_PATH是运行时指定的动态链接库所在目录。其中的名字前后都加了*表示命名中只要存在这个搜索的字段就行。注意:文中的LIBRARY_PATH是编译时指定的路径。原创 2022-09-18 16:51:25 · 1000 阅读 · 0 评论 -
C++枚举类型:typedef enum的用法
【代码】C++枚举类型:typedef enum的用法。原创 2022-09-11 16:27:20 · 3503 阅读 · 0 评论 -
【c++工程构建】linux下gcc编译头文件搜索顺序、环境变量和动态库路径问题浅析、Cmake
1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大。原创 2022-09-11 14:06:38 · 1579 阅读 · 0 评论 -
C++11标准|用C++写一个矩阵(包含了如何用cmake构建一个工程)
1.改进版2的矩阵乘法是很慢的,相比matlab差了至少1w倍,我们可以采取以下方式提速,cpu的并行指令,gpu的并行计算,但这些技术都太深入了。因为改进版2的矩阵乘法有三层for循环,版本1的k在最内层,版本2的i在最内层,版本3的j在最内层,用版本3时就可以实现缓存优化,对程序效率有所提高。3.在Matrix的成员函数里重载了()符号,函数名就是operator(),如A是Matrix类的对象,重载后就可以这样用,A.operator()(2,1) = 77等效于A(2, 1) = 77。原创 2022-08-02 22:36:33 · 4347 阅读 · 0 评论 -
【C++必知必会】指针常见用法和解引用
补充:在C++/C中,变量名只是标识符,对变量名的理解是在变量定义时候,把某一区域的存储空间起一个别名(变量名)。在程序编译时,变量名被转换为对应的内存地址,该地址用于存储变量的值。例子一、指针: int num = 4; int *p = &num,表示将整型num变量的地址赋值给一级指针变量p,一级指针变量p存放的内容就是整型num变量的地址。解引用: *p,表示对指针变量p进行解引用就是把p内容的这个地址对应的东西解开,解出来,就像打开一个包裹一样,拿到它的值,那就是该变量的值了。例子二、指原创 2022-07-28 22:39:56 · 5058 阅读 · 0 评论 -
关于C++函数返回值的使用方式以及局部对象何时析构的问题
函数的局部变量如果作为返回值的话不会在出作用域{}即函数执行完毕后就立即消亡,会稍微延长它的生命周期。原创 2022-07-28 20:57:59 · 624 阅读 · 2 评论 -
C++中指针free/delete后为什么要刻意指向NULL
这是因为指针p被free/delete之后,没有置为NULL(最好加一句p=NULL;),经常性的我们会以为p是个合法的指针。他们只是把指针指向的内存给释放掉,并没有把指针本身干掉,此时指针指向的就是“垃圾”内存。所以我们应该在释放完之后,立即将指针置为NULL,防止出现乱指的情况。野指针是指向不可用内存区域的指针(非法内存,垃圾内存)。野指针不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为if语句能够判断。但是野指针是很危险的,if不能判断一个指针是正常指针还是野指针。...原创 2022-07-28 14:57:36 · 2205 阅读 · 0 评论 -
c++宏定义详解及真实应用举例
define CV_8U 0表示的是CV_8U会在预处理时被编译器替换为0,注意的是这个替换是单向的,即只能把CV_8U看做0,不能把0看做CV_8U!举个例子,因为这样就可以用作判断了,增加可读性,如此时的type是CV_8U,可以用if(type==CV_8U)语句,因为CV_8U在编译时被替换成了0,就相当于实际执行时是在执行if(type == 0)的语句。以#开头的行都是预处理指令,用于指示编译器做一些预处理工作,预处理实现的是文本替换而不是值替换,预处理指令不是语句,所以行尾不要加分号。原创 2022-07-28 14:23:24 · 1206 阅读 · 0 评论 -
C++类中public、protected、privated的区别
即只能在定义该类的区域中访问该属性成员,在该类的类区域外的任意位置均无法访问访问该属性成员,且该属性成员无法被继承类使用;:即只能在定义该类的区域中访问该属性成员,在该类的类区域外的任意位置均无法访问访问该属性成员,但该属性成员可以被继承类使用;:即在程序的任意位置均可对类中的该属性成员进行访问,不受任何约束限制;原创 2022-07-28 13:14:47 · 1632 阅读 · 0 评论 -
C++|为什么重载运算符要返回自身的引用,右值引用代码示例
在c++11中,右值(将亡值)作为参数就会优先匹配到一个右值引用的重载,左值作为参数就会调用左值引用的重载。3.typename关键字(等同于class关键字):对于用于模板定义的依赖于模板参数的名称,只有在实例化的参数中存在这个类型名,或者这个名称前使用了 typename 关键字来修饰,编译器才会将该名称当成是类型。2)左值引用就是一个不能变的指针,所以说在定义的时候就需要给它初始化,因为初始化后,它就一直引用该变量,不会再引用别的变量了。的话,那这个临时变量的生命周期就会被延长,直到常引用被销毁。原创 2022-07-27 17:25:27 · 757 阅读 · 0 评论 -
【C++】关于析构函数容易混淆的地方
而只是对象在销毁时会自动调用析构函数,完成我们定义的类的一些资源清理工作。类中如果没有涉及到资源管理时,析构函数是否给出无所谓;但是如果涉及到资源管理,用户必须要显式给出析构函数,在析构函数中清理对象的资源。类中如果没有涉及到资源管理时,析构函数是否给出无所谓;但是如果涉及到资源管理,用户必须要显式给出析构函数,在析构函数中清理对象的资源。4、对象生命周期结束时,C++编译系统系统(编译器)自动调用析构函数,完成对象中资源的清理。3、一个类有且只有一个析构函数。1、“析构函数名是在类名前加上字符 ~。原创 2022-07-27 16:50:14 · 124 阅读 · 0 评论 -
C++|const int &x和int &x和int x之间区别以及const在函数前后的作用
const在函数前后的作用是前面使用const表示返回值为const,后面加const表示函数不可以修改class的成员。原创 2022-07-27 16:05:03 · 586 阅读 · 0 评论 -
C++中头文件(.h)和源文件(.cpp)都应该写些什么,头文件中的预编译语句作用,命名空间和头文件的区别与联系,内部链接和外部链接
C++中头文件(.h)和源文件(.cpp)都应该写些什么,头文件中的预编译语句作用,命名空间和头文件的区别与联系,内部链接和外部链接原创 2022-07-25 12:44:47 · 3163 阅读 · 0 评论