自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

见牛羊的博客

做个快乐的人

  • 博客(47)
  • 资源 (3)
  • 收藏
  • 关注

原创 将double类型转为两个float类型存储(顺带看看初版到最终版的优化思路)

实际工作中碰到一个需求,将一个double类型的变量,存储成两个float类型。最后再根据两个float类型转回double类型。因为实际的信号列表已经定义了好了两个float类型,所以只能以这种折中的方法将double类型存储下来。

2024-03-30 10:57:21 209

原创 C++ 关键字小结

delete 的作用和=default 有点相反,是显式的表示不用某个默认的函数。比如,有时候我们不想使用默认的拷贝构造函数,就可以写如下的代码。比如,用户如果写了自己的构造函数,那么编译器就不会创造默认的构造函数了,这有可能会带来编译错误。在执行A a3 = a1;=default 一般会放在默认的构造函数,析构函数,拷贝构造函数,拷贝赋值函数,

2024-02-14 21:31:07 164

原创 shared_ptr放入vector,要及时clear,避免内存泄漏

最近碰到一个内存泄漏的问题,查了半天发现是vector数组的成员中有共享指针,而vector没有释放引用计数导致的。可以看到,因为使用了vector而没有清空,增加了智能指针的引用次数,但是在使用完vector之后没有释放,到时计数没有回归。我们看看嵌套一个结构体,结构体里也有一个共享指针会如何。这里我们来引深一下,为什么放入Vector之后,

2024-02-14 18:54:55 598

原创 卡尔曼滤波详解(1)

更新部分的三个公式来源,实际上是由两个正态分布的公式相乘的结果得到的。根据预测部分的结果,我们得到了预测的当前时刻的状态量,这个状态量其实服从高斯分布。同时,在当前时刻,我们有当前时刻的观测量,这个量也服从高斯分布。更新部分的主要操作,就是将这两个高斯分布的量结合,得到一个方差更小的高斯分布。图示如下(这个图是来自。

2024-02-12 20:50:38 1012

原创 C++单例模式详解

起因是在程序中重复声明了一个单例模式的变量,后来程序怎么调都不对,最后发现变量是用单例模式,修改是全局的,所以决定好好梳理一下单例模式。首先,为什么要用单例模式,就是因为我们希望一个类只有唯一一个实例,并且提供一个全局的访问点。从这个描述不难看出,这个实例应该是要static来修饰的。。

2024-02-05 16:44:08 2389

原创 ASAN 内存问题检查工具

ASAN可以定位的内存问题有:内存越界(堆内存越界,栈内存越界,全局变量越界),内存释放后使用,读取未初始化内存,内存泄漏。

2023-09-22 16:41:37 311

原创 C++:constexpr 和 const 的区别

constexpr 是 C++ 11 标准新添加的关键字,原先的标准中是只有const关键字的,作用是表示只读常量。但是,其实只读常量是两个属性,分为只读和常量,都用const来表示会产生歧义。这里补充const的一个重要概念就是,const后面的变量,仅仅表示不能通过该变量改变背后实际的值,但是如果其他变量也能够表示同一块内存空间,这个内存空间里的值是可以通过其他变量来改变的。上面的程序做如下修改,arr2就可以正常的编译,因为传入的是一个constexpr代表的常量类型。

2023-09-18 19:10:07 256

原创 小记录:tcpdump的常用命令

基本的抓包命令, 从eth0 抓取,保存到xxx.pcap。# 可以按照协议抓取,如udp,ip,arp等。# 抓取源ip 或目的 ip的包。# 抓取多个源ip的包。

2023-09-11 15:52:01 314

原创 旋转矩阵左右乘,弄清变换关系更重要

关于矩阵左乘和右乘的区别,看了不少数学解释,大概是我水平不够,不是很懂的样子。但本来我也是做应用,抛开理论不谈,看看左乘的实际的使用情况。这个非常的重要,如果没有定义好矩阵下标和坐标系之间变化的关系,就会彻底陷入混乱。但实际上我们是把上述坐标系的变换定义为左乘的,这比较符合我们的阅读习惯。先不考虑左乘还是右乘,对于矩阵乘法来说,是遵循内项相消的。这里,如果我们有坐标系3到坐标系2的矩阵变换关系。,就可以得到坐标系3转到坐标系1的变换矩阵了,即。,以及坐标系2到坐标系1的矩阵变换关系。就是说,我们是先有了。

2023-09-06 20:03:48 723 6

原创 C++小技巧, vector的resize,reserve和push_back

在使用C++的vector时,一不注意就会是的vector越界,或者在push_back后遍历vector发现前面的值根本不是自己想要的值。可以明显看到,resize之后,vector的size变成了5,而在push_back之后size变成了6。而往往我们想事先初始化vector的空间,其实应该使用reserve,而不是resize。

2023-08-25 17:09:11 603

原创 Yaml配置文件读取方法

另外,上面提到的类型问题,在这里用.as来体现,将对应的配置文件中的值,读入成程序中期望得到的值的类型,这里test_name希望读入为string。在日常的代码中,有一些值是配置文件中定义的,这些值可以根据用户的要求进行调整和改变。这样开放程序给用户时,就可以不必开放对应的源码,只开放yaml格式的配置文件即可。但是读入之后,其实是有对应需要的类型的,比如is_debug读入后需要时bool类型,test_time读入之后需要是int类型。我们先写一个简单的配置文件,然后将其中的值读入到程序中。

2023-08-24 17:21:52 644

原创 C++ 编译告警: delete called on that is abstract but has non-virtual destructor

上述告警在使用arm编译器编译的时候报出,意思是缺少虚的析构函数,在delete被调用的时候,会造成问题。典型的就是内存泄漏。看例子:、1. 正常情况上面代码中的两个类,一个是基类Base,一个是继承Base的子类Child。按照正常的声明方式,调用运行。这是最正常的情况,声明了一个子类,首先会调用父类的构造函数,然后调用子类的构造函数。析构时先调用子类的析构函数,再调用父类的析构函数。

2023-07-06 17:53:12 567

原创 C++结构体内有指针,直接赋值报Segmentation fault原因分析

最近写程序的时候,用了别人定义好的结构体,结构体的成员变量包含指针,直接赋值后运行报段错误。下面对这个问题进行一下分析。

2023-06-08 19:19:21 1217

原创 CMakeLists 写法总结

之前简单介绍了makefile的写法,但实际工程中基本不会手写makefile,通常情况是会写一个CMakeLists甚至是多层多个CMakeLists来构建整个工程。关于makefile和CMakeLists的关系:make命令实际上是按照makefile中的内容来执行的,而CMakeLists就是用来生成makefile的,是cmake命令按照CMakeLists中的内容生成makefile文件。

2023-04-08 22:17:56 2682 1

原创 Eigen::Matrix的6个模板参数含义

Eigen Matrix 模板参数解释

2023-03-20 19:26:04 341

原创 git入门实用技巧

git入门实用技巧

2023-03-12 22:58:54 333 1

原创 C++面经总结1——类相关

C++面经自己整理,按主题发出,本偏主要和类相关

2022-11-13 19:28:31 473

原创 Linux定时器2

1. POSIX定义的定时器有了上一篇关于setitimer定时器的介绍,相信Linux下定时器的用法已经有了基本了解。我个人在使用setitimer定时器的时候,有一个非常头疼的问题,就是setitimer定时器不能设置多个。严格意义上讲,setitimer定时器只能按照时间处理的类别,分别设置三种定时器,即ITIMER_REAL,ITIMER_VIRTUAL和ITIMER_PROF三类,具体解释见上一篇博客。但这非常限制Linux下定时器的使用。解决方法,就是用POSIX下定义的定时器。可以把P

2021-11-26 15:02:40 1988

原创 Linux定时器1

目录1.itimerval-定时器的基本时间单元2.setitimer——创建定时器3.简单实例1.itimerval-定时器的基本时间单元首先要理解itimerval结构体,这是组成定时器的基本时间单元。关于timeval结构体,上一篇博客有讲到,是由秒时间和微秒时间组成的。这里it_interval表示的是一个timeval类型的时间,这个时间是创建的定时器的周期性。即如果这一时间设置为5s,则该定时器每5s触发一次。Itvalue也是timeval类型的时间,表示首次倒计时时距离定

2021-11-17 18:37:28 566

原创 Linux下有关时间的函数:time,times,clock,gettimeofday等

因为项目需要,所以把Linux和windows下时间及计时器相关的内容都刷了一遍。终于抽出时间总结一下。目录1. 时间的概念2. 获得时钟时间的函数2.1 时钟时间的存储类型2.2 time函数2.3 gettimeofday函数3. 获得程序运行的时间(即进程时间)3.1 进程时间的存储类型3.2 times函数3.3 clock函数4. 补充说明1. 时间的概念首先理解时钟时间,也叫做墙上时钟时间,可以简单理解为宏观上经过的时间。细究起来就是进程运行的

2021-10-14 14:19:58 5092

原创 Linux使用gcc生成与使用动态库与静态库

1. 动态库与静态库的区别能够自己生成库文件并使用自己的库文件,对理解一个大型的工程以及模块开发是很有好处的。事实上,我们进行模块开发的时候,往往是接触不到主程序的,开发的模块通常都是打包成库文件供他人使用的。库文件分为动态库与静态库,动态库一般是以.so为结尾的文件,静态库一般以.a为结尾。动态库和静态库在编译过程中的区别是在链接的时间,动态库是在程序执行的时候被链接的,而静态库是在编译过程的链接阶段被链接的。这意味着,使用动态库时,库必须和可执行程序同时存在,不能被删除。而使用静态库时,在链..

2021-09-02 19:42:56 215

原创 C++编译过程详述

想总结一下这个问题是我突然有一天好奇编译头文件和编译头文件对应的源文件有没有区别,因为写makefile的时候依赖即可以写头文件,又可以写源文件。在网上查了半天,估计我的这个问题比较stupid,也没有明确的回答。索性顺藤摸瓜看了看C++的编译过程,虽然之前大致有个了解,但不够仔细。这一看发现,区别肯定是有的(尽量编译源文件而不要尝试编译源文件对应的头文件)。但更重要的是,把编译过程清楚捋一遍,解释了我之前不少的疑惑。而学c++的时候上手就是vc6.0,对理解编译过程太不友好。所以还是应该有个全面的认识。(

2021-08-11 12:57:25 637

原创 前置递增运算符(++)比后置递增运算符效率高的原因

前置递增运算符比后置递增运算符效率高,当然递减运算符也是一样的。我一开始是不理解这句话,而且在接触程序之初,似乎更习惯用后置的情况,即经常会写成i++。前置的形式是返回递增或递减之后的对象,只需要返回该对象的引用。而后置的形式返回的是递增或递减之前的对象,因此需要额外创建一个对象副本,返回的不是引用,而是这个副本对象。虽然有点抽象,但是上面这段话可以说就是标题的回答了。下面把上面这段回答翻译成人话,啊,不,翻译的直观一点~。从两个方面来说明,使用效果上和实现方法上。使用效果上。对于++i和i+

2021-08-08 17:27:36 616

原创 C++ STL 迭代器用法总结

最近写东西用到了unordered_map容器,然后想要逆向遍历一遍哈希表,结果报错。研究了一下发现STL中不同容器对应的迭代器有很大的区别。关于迭代器,之前一贯粗浅地按指针来理解了,借此机会详细总结一下。1. 迭代器说明迭代器的作用是介于容器和算法之间,迭代器大致分为5类:随机访问迭代器,单向迭代器,双向迭代器,输入迭代器,输出迭代器。其中主要使用的,也是最重要的是前三种。随机访问迭代器:支持通过偏移量访问,比如it+5。单向迭代器:一般都是正向,仅支持++操作,不支持—操作,不支持偏移量

2021-08-07 15:12:42 556

原创 计算机存储单位与网络传输单位

最近在算报文传输的各种速率的时候,被各种单位搞得比较混乱。这里重新梳理一下。最重要的是,计算机存储单位我们通常习惯以字节(Byte)来计算,而网络传输中,运营商等的几M宽带习惯以位(bit)来计算。计算机存储单位计算机中最小的存储单元是位(bit)也有记为B的,为了避免混淆,我一律记为bit。而最常用的,也是我们最习惯的存储单位是字节(Byte),1Byte=8bit为什么说我们最习惯的是字节而不是位呢,应为我们日常用的KB,MB,GB中大写的B都是Byte。其中关系为1KB = 210

2021-08-02 12:36:26 1191

原创 Const在函数前后的区别

知识点小结:const放在函数后主要是限制类中的成员函数,const放在函数前是限制函数返回类型为指针时通过指针对返回值的修改。const在函数前:Const在函数前实际上是约束函数的返回的,表明返回的值不能做左值,实际上就是防止返回值直接被赋值。但是一般的变量无法修改函数返回值,其实是为了防止函数返回类型为指针类型时,通过指针对返回值进行修改。非指针的函数返回类型前加const是没有意义的。示例如下。特别注意,要用const int* 类型的变量接住函数的返回值,如果只用int* 类型是不

2021-07-21 18:55:48 6056

原创 函数参数中指针传参和引用传参的区别

引用符号&和指针*都可以在函数参数中出现,但使用上是有区别的。首先这两种用法如果在函数中对传入的参数有所改变,那么这种改变是会一直保留的,不会在函数作用域外就恢复。当然,也有很多时候我们不希望传入的参数被人为的改变,这时候可以使用const关键字,关于const和引用符号&的搭配,防止传入参数被改变的情况可以参考这篇文章虽然引用和指针的方式作为传参方式都会保留该函数对传入参数的改变,但这两种方法还是有区别的。这个区别表现在,引用的方式下可以直接使用该参数,而指针的方式通常都需要解引用,或

2021-07-20 19:59:40 3744 2

原创 C++ 深拷贝、浅拷贝和拷贝构造函数

浅拷贝:浅拷贝就是指不重新申请新的内存空间,仅仅是给原来被拷贝的量取了一个别名。这两名字都是共用的同一块内存空间。最典型的就是指针变量赋值。在通过一个指针修改了内存空间中的内容后,另外的指针也会发生相应改变。如下所示:#include <iostream>using namespace std;void test1(){ int* p1 = new int(1); int* p2 = p1; cout << "*p1 = " <<

2021-05-15 14:34:21 275 2

原创 C++ 重复释放同一块内存空间没有报错的思考

是因为重复使用delete删除相同的内存空间,但编译器竟然没有报错,所以开始了一系列关于内存空间的尝试和思考。1. 内存空间被释放,不代表存储的内容被删除。一块内存被delete后,只是从是否可以被再次分配的意义上进行了释放,其中原先存储的内容不会立刻被抹除。可以简单写代码验证如下:int main(){ int *a1 = new int(3); cout << "*a1 = " << *a1 << endl; delete a1

2021-05-12 15:47:29 4159 14

原创 Makefile编写方法小结

目录1.基本写法基本写法Makefile的编写方便了在linux下编译大型的C/C++的程序,同时,Makefile的写法相对灵活,我们从最简单的方法入手。最简单的方式其实就是原始的gcc或者g++的语法,但是要明确makefile最最基本的语法规则。Target … : prerequisites …Command1Command2…这个格式必须使用,即编译的目标,冒号,编译目标的依赖执行的操作下面我们简单写一个main函数,其调用了加法和减法器中的函数。具.

2020-12-25 14:36:05 2303

原创 Opencv在visual studio2019的部署

本意是想试一下opencv的功能的,没想到部署在visual studio的时候踩了很多坑,于是把这个过程记录下来。下载opencv并解压首先是下载opencv并解压,下载下来的就是一个压缩包,解压后的文件夹位置要记好,后面有用。我下载的是opencv3.4.1。不想自己找的也可以用我这个。解压后的文件夹如下图所示。2. 打开visual studio 2019并找到Microsoft.Cpp.Win32.user或Microsoft.Cpp.x64.user(手动添加)这一步是最坑的,我

2020-11-02 16:42:03 388 1

原创 NCNN 跑benchmark方法

下面从几个方面介绍下自己的采坑之路:NCNN自带模型的benchmark NCNN交叉编译到rk3288(armv7架构)和rk3399(armv8架构)的方法 NCNN转换其他模型并加入benchmark中NCNN自带模型的benchmark1. 下载NCNNNCNN这类开源引擎都可以从github上下载下来,下载下来的整个文件夹就像一个完整的软件或者生态系统一样,之后的所有操作都会在这个文件夹里完成。下载方式可以直接去官方的github上下载,我的是ubuntu系统,也可以直接git。

2020-10-18 21:15:44 2942 2

原创 C++ 结构体指针与结构体数组的赋值

知识点小结:当需要批量赋值结构体的时候,可以使用结构体数组。对于结构体指针,可以用来指向结构体数组的首地址,但是不能按照结构体数组的赋值方式进行赋值,感觉是无法预知后面批量赋值的大小。具体情况见以下代码:#include <iostream>using namespace std;struct student{ string name; int score;...

2019-07-18 22:15:39 13603

原创 C++ new的用法

知识点小结:new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是,new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。具体的代码如下:#include <...

2019-07-18 20:40:39 241073 29

原创 C++使用默认堆结构并进行排序

知识点小结在使用C++时,遇到需要排序的情况我们不能总是手写排序,有的时候我们会借助堆结构来进行。但是需要注意的是,C++默认的堆结构是大根堆,而且push进堆结构的数据一定是能够比较的。C++中的堆类型是放在头文件<queue>中的,调用大根堆的方法是priority_queue<数据类型> 名称。如果是无法默认比较的数据类型,就需要自定义比较器或者在结构体内部定义比...

2019-07-05 18:34:18 510 2

原创 C++ const和&在函数参数中的含义

知识点小结C++中有的函数参数会用const来传递,同时配合&取地址符一起使用,形式如 void form(const int &a)。一开始并不懂其中深意,后来查了一下,发现这种用法和值传递的效果是一样的。但是因为引用的效率较高,所以在参数是复杂的数据类型的时候,采用这种常量引用的方法。这样既使用了引用,又使用const限制了对参数的修改。具体代码如下图所示:#inc...

2019-06-29 03:33:19 8925 1

原创 C++ 整型与字符串类型的互相转化

知识点小结多年前对类型转化这个概念的认知停留在可以强制类型转化上,最近在整型和字符串类型互相转化的时候才发现原来说的不是一回事。下面提供我对这个知识点的小结。整型向字符串类型转化需要借助sstream头文件,而字符串向整型转化需要借助stdlib.h头文件,具体的过程如下。#include <iostream>#include <string>#include...

2019-06-29 03:03:24 376

原创 C++ 自定义函数返回类型

知识点小结C++的基本数据类型限制了函数的返回类型,其不像python一样可以直接返回一个list,list里面可以包含多个想要返回的内容。为了能够让C++的函数返回类型也可以不受数量上限制,我们可以先定义一个我们希望的数据类型的类或者结构体。如果使用类的话,该类当中只包含成员变量和构造函数。下面我们定义一个同时返回一个数字和一个字符串的数据类型。具体代码如下:#include <...

2019-06-29 00:11:06 6297 3

原创 C++ STL典型容器queue,vector,stack的使用方法

知识点小结:在使用c++已有的容器时,虽然queue,vector和stack一些基本操作都是类似的,但因为其函数名称不同,比如返回首元素有的是用front,有的是用top。没有整理经常混乱,下面对这几种典型类型的基本操作函数进行一下小结。首先是stack的操作,基本操作有压入push(),弹出pop(),返回首元素top(),返回大小size(),判断是否为空empty()。#in...

2019-06-16 23:49:10 3913

原创 C++ 关于结构体与类的使用,以及“.”和“->”的使用

知识点小结之前定义链表的的时候都是拿结构体来定义的,然后声明的时候就自然声明成了指针。于是所有访问结构体内部成员变量的时候都用的“->”符号。其实在声明的时候是可以不用声明成指针的,继而可以使用“.”符号来访问成员变量。对于C++来说,关键在于分清楚使用结构体时,什么时候适合声明成指针,什么时候适合不声明成指针。如果是定义链表这样内部成员变量包含指针的结构体,则声明时最好声明称指针,如果...

2019-06-14 04:07:55 2048

visial studio2019缺少的MsBuild文件

visual studio 2019 配置opencv时会出现找不到Microsoft.Cpp.x64.user的情况,是缺少相应的MsBuild文件导致的

2020-11-02

armv7交叉编译工具.rar

这是armv7的交叉编译工具,我用来在rk3288的板卡上进行交叉编译时用的。是在linaro的官网上下载的,2018版的,很好用。

2020-10-18

armv8-Liunx交叉编译工具.rar

2019armv8交叉编译工具,个人用于rk3399的交叉编译,是64位的linux系统。是我从官网上下载的。国内的网络下载很慢,这里分享给大家,亲测可用。

2020-10-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除