![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 78
洛克希德马丁
当你凝视深渊的时候深渊也在凝视你!
展开
-
C++一文讲透thread中的detach和join的差别
无论哪种语言线程在绝大多数项目中都是会用到的,C++也一样,C++包装了一个std::thread类可以简化程序员的编程,但在使用过程中也要注意区分用法,否则可能适得其反。今天要讨论的就是单纯的thread的join(等待)和detach(分离)两种情景,让不懂得人看完之后茅塞顿开。不管哪种方式启动的线程都要保证资源的回收,特别是当心主线程早于子线程结束的情况。原创 2024-06-19 18:12:19 · 526 阅读 · 0 评论 -
一文讲透C++的volatile关键字
我们平常使用C++编程的时候可能volatile关键字用的并不多,这个关键字特性在底层硬件编程中用的很多。表示变量可能在程序控制之外被改变,例如被硬件中断或者其他程序所修改。因此,编译器在每次访问该变量时都会重新读取它的值,而不是使用缓存的值。所以它的主要特性就是每次访问都重新读取它的值,而不是使用缓存的值。1、volatile主要用于底层硬件编程,平常编写代码不一定用得上。2、volatile也可能进cache或寄存器,不保证同步,没有原子性,不保证内存顺序。原创 2024-06-18 17:20:15 · 337 阅读 · 0 评论 -
gstreamer+mpp调用硬解码播放视频
以前一直在MPP上开发硬解码推理,最近想弄一个盒子支持调用mpp硬解码播放视频的。我使用的盒子是firefly的rk3399,这个板子的cpu说强也不强,说弱也不算太弱。1、目前实现了视频播放,接下来研究chrome硬解码和播放器硬解码。原创 2024-06-06 21:05:07 · 286 阅读 · 0 评论 -
C++结合ffmpeg获取声音的分贝值
最近面对一个需求,就是需要传递声音文件到模型里推理完成语音转文字,问题是我们使用的是麦克风啊,由于这个特殊属性就需要有一个合理的方法来判断声音的开始,声音的结束和声音的长度。像科大讯飞这样的库已经有这个功能了,如果遇到没有这个功能的怎么办,还得靠自己。方法其实有很多,我们这里使用根据分贝来判断,首先就需要获取到分贝。1、代码完全基于单声道音频,没对多声道进行处理,理论上除了参考值不同对多声道音频也是能处理的。原创 2024-06-04 15:18:24 · 902 阅读 · 0 评论 -
香橙派 AiPro硬解码能力详细测试
拿到这块开发板的时候号称可以同时硬解码20路1080p@30fps,事实是否真的如此,让我们拭目以待。1、官方诚不欺我,事实如此。2、编码能力标称是20路1080p@30fps,有时间再测测。原创 2024-05-30 15:05:19 · 417 阅读 · 0 评论 -
Windows和Linux系统上paho-mqtt的编译和使用
有时候我们需要使用mqtt,当然最出名的应该就是paho-mqtt了,今天我就手把手教你在Windows和Linux系统上编译和使用paho-mqtt。1、还行。原创 2024-05-21 17:36:48 · 936 阅读 · 0 评论 -
C++实现字符串分割
我没记错的话java有字符串分割的接口的,C++没有这个接口,或者说没有直接支持这个功能,但是我们可以自己手搓一个。这里有两种方式实现,当然实际不止两种,我介绍两种常用的方法。1、无论哪种方式都需要注意空格造成的影响,正则表达式可以很好解决空格问题2、建议优先使用正则表达式,代码更清晰易懂1、还好。原创 2024-05-17 10:15:41 · 268 阅读 · 0 评论 -
VSCode配置Eclipse快捷键
有时候我们可能会同时使用很多种IDE,每种IDE又有不同的Keymap,快捷键用起来很头疼。比如我,我最早是使用eclipse的,后来就习惯了eclipse的快捷键,哪怕用Android Studio、Clion、Virtual Studio等等我都喜欢切换成eclipse的快捷键,大大加快效率。提示:以下是本篇文章正文内容,下面案例可供参考1、这不是偶然,很多知名的IDE都有这个功能,因为它真的很有用。原创 2024-04-25 17:03:37 · 579 阅读 · 0 评论 -
C++11 reinterpret_cast讲解
我觉得C++里面有一个很神奇的转换叫reinterpret_cast(类型不相关转换),它和诸如static_cast、dynamic_cast都不一样,这种转换有时候让人摸不到头脑,但是有些场景非常有用。简而言之,类型不相关的转换。但是不是说可以随便转换,它主要用在指针与指针之间,指针和long之间等等。必要条件是两种类型之间必须有相同的位模式,而且转换过后不能直接拿来用,必须转换回来才能使用。1、研究了很久还是决定拿出来掰扯掰扯。原创 2024-04-02 21:19:12 · 1461 阅读 · 0 评论 -
多系统使用ffmpeg读取麦克风数据
最近在搞一个项目需要用到麦克风读取数据并分析,我的开发环境是Ubuntu-22.04,这个操作系统的声音架构是基于alsa+pulseaudio构建的,18.04和20.04一样。这里我会稍微向你展示下alsa和pulseaudio的些许差别,当然这只是这个系统的冰山一角,感兴趣的可以继续研究下去。1、方法不止这些,还需要继续研究。原创 2024-03-26 21:49:35 · 1051 阅读 · 0 评论 -
多系统编译安装libmodbus库
学习modbus协议的都知道libmodbus这个库是modbus协议非常经典的库了,代码量少但功能强大,兼具编译简单的诸多buffer加持,还有什么理由不用呢。这篇文章就是教你怎么配置使用,跟着我少走弯路。1、Windows比Linux稍微复杂点,总体没什么难度。原创 2024-03-26 20:16:40 · 496 阅读 · 0 评论 -
JavaScript Uncaught ReferenceError: WScript is not defined
最近在Visual Studio 2019上编译libmodbus库,出现了很多问题,一一解决特此记录下来。原创 2024-03-26 18:17:49 · 294 阅读 · 0 评论 -
C++代码中goto的作用讲解
goto语句在大多数由程序员直接完成的高级程序设计任务中都没什么用,但是在由别的程序生成的C++代码中非常重要。例如,goto可能会出现在一个由解析生成器生成的解析程序中。1、应该来说跳出循环可能是最有用的功能了2、goto可以通过逻辑控制替代。原创 2024-03-22 22:01:26 · 685 阅读 · 0 评论 -
记录一个Ubuntu-18.04上ffmpeg遇到的一个奇葩bug
要不是亲眼所见,打死我都不相信。安装的ffmpeg无缘无故突然访问不了了。原创 2024-03-15 16:27:44 · 399 阅读 · 0 评论 -
Clion配置远程服务器并在上面开发
作为开发C++最强大IDE之一,Clion确实相当好用了,可惜没有社区版。不过,你先不要可惜,专业版有一个功能那就是远程连接。我觉得这个功能才是Clion的灵魂,当你还在为配置环境而头疼的时候不妨来试试这个功能。1、基本没有难度,可能有人不知道这个功能。2、Pycharm、IDEA、WebStorm等等都有这个功能,貌似社区版没有,只有高级版有。原创 2024-03-14 20:50:03 · 1061 阅读 · 0 评论 -
Clion配置并使用rsync
Clion这个工具和别的IDE不太一样,虽然都是Jetbrains开发的,但是目前为止它是没有社区版的,就是说要想用必须付钱。别的不说,就我用过的那么多开发C++的IDE,它确实好用。特别是远程功能,可以将本地代码推送到远程机器编译调试。美中不足的就是自带的SFTP不好用,至少不如rsync好用。1、蛮简单的2、功能很强大,用好了如有神助。原创 2024-03-14 11:25:05 · 493 阅读 · 0 评论 -
fastllm移植到Windows加快LLM推理
最近在搞一个关于Chatglm-6B的项目,一个普通的回答要接近5秒钟,经过研究发现fastllm有明显的加速,加速后1.5秒,而且也没发现损失什么精度。1、原作者只给了Linux上的编译方法,Windows的还是费了些波折。原创 2024-01-31 11:21:42 · 1273 阅读 · 0 评论 -
Ubuntu-22.04编译安装FLTK
最近在研究FLTK,突然对它感了兴趣,就想使用Clion跑一些项目。经过一下午不断摸索,终于在Linux上跑起来了Demo,现在分享给需要的各位。1、我拿Windows的代码直接在Ubuntu上编译运行,一句代码都没有改,这种移植性非常好。原创 2023-12-26 17:25:24 · 355 阅读 · 0 评论 -
Windows基于Mingw编译安装FLTK
最近在研究FLTK,突然对它感了兴趣,就想使用Clion跑一些项目,结果基于FLTK源代码编译在Windows11上各种报错。我仔细研究了下ide描述,基本可以确定主要基于VS的配置,MingW官方只是轻描淡写了下,实际编译还是报错。经过一下午不断摸索,终于跑起来了Demo,现在分享给需要的各位。1、没想象中那么难,一开始以为要上VS大法了,结果虚惊一场。2、Linux上会简单很多。原创 2023-12-26 17:05:56 · 572 阅读 · 0 评论 -
C++对象的生命周期详细解读
我们写C++就不可避免需要用到变量,用到变量就要知道生命周期原则,要不然写的代码自带bug,崩盘只是迟早的事。生命期顾名思义就是出生到死亡的这个时间。放到C++的对象上就是从对象被创建开始到对象被回收结束这么一个过程。1、掌握这三种对象的生命期就可以写出没有bug的代码了,前提是深刻理解。原创 2023-12-22 17:39:04 · 978 阅读 · 0 评论 -
C++内存空间详细解读
我们都知道C++和C语言一样都是基于堆栈结构设计的语言,Java虽然有虚拟机而且自动回收内存,他也是基于堆栈式结构设计的语言。当然,我们今天主要讨论C++的内存空间类型,只不过首先要了解它的语言结构。1、用好三种内存就足够了。原创 2023-12-22 16:52:48 · 144 阅读 · 0 评论 -
C++的作用域详细解读
写C++离不开一个重要的概念那就是作用域,作用域是C++语言非常重要的一个概念,接下来我们就一起看看C++的作用域。学好C++作用域必须理解透彻,这样才能用好!原创 2023-12-22 15:10:02 · 1319 阅读 · 0 评论 -
c++编译使用log4cplus
C++很强大,但是仍然有很多不尽如人意的地方,比如打印日志方面就没有java的log4j那种信手拈来,自然而然地东西。目前官方没有推出这个东西,只能借助第三方开源项目实现,或者干脆自己实现。但是,今天我们说一说一个很强大地日志库log4cplus在c++项目中地使用。log4cplus配置项众多,可以根据需要来配置。请注意,不同的版本分支配置项可能不一样,请注意区分。这个东西在配置文件里可以看到,这里不细说了。--with-qt主要包括调试,so版本号支持,宽字符支持和本地化等。原创 2023-10-24 15:11:23 · 436 阅读 · 0 评论 -
C++11打断线程的几种方式
我们都知道在C++11中可以方便启动一个或多个线程,常规的手段是让线程执行完任务后自己结束自己,或者在达成一定的条件时退出。如果,我想在运行途中停下来怎么办?这篇文章就提供几种可行的方法。取消点:线程并不是所有时刻都可以打断,只有当线程到达取消点的时候才可能被取消,通俗来说就是阻塞。诸如join、wait、sleep、IO操作都是典型的取消点。1、优先使用Boost的方法,没别的原因,就是简单。2、当然线程自身也可以打断自己,只不过我一般选择标志或自动结束更简单些。原创 2023-10-09 16:51:13 · 1030 阅读 · 0 评论 -
Clion配置WSL2环境
我最近在使用Clion,因为我有些时候需要操纵硬件,而且有些软件没有Linux版本,所以没办法就在Windows11上使用Clion,然后配置一个WSL2环境。这种配置,除非你对Linux有硬件上的需求(需要使用Host版的Linux),软件上的场景基本能满足。等到有一天微软彻底解决硬件互通的问题(目前显卡支持访问),WSL2和Windows的深度集成将成为一大神器。总的来说没什么难度。原创 2023-07-24 13:45:49 · 1038 阅读 · 0 评论 -
CUDA和CUDNN安装和版本验证
使用CUDA开发AI项目必然离不开CUDA和CUDNN的安装,今天这篇文章就是教你怎么验证CUDA和CUDNN是否安装成功和验证版本是不是安装对了。1、方法还有很多,两个就够了2、如果环境有问题,大概率测试程序是跑不完的。原创 2023-07-03 17:54:39 · 2829 阅读 · 0 评论 -
windows环境cmake引用boost库
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。原创 2023-06-20 18:29:17 · 3864 阅读 · 0 评论 -
C++11 模板实参代入失败
使用C++实现“泛型编程”必然离不开模板的使用,模板简化了程序设计,简化了实现,解决了代码臃肿的问题。像STL(Standard Templete Library)里的函数基本都使用了模板。在生成一个候选函数来解析一个函数调用的过程中,如果编译器发现生成一个模板特例化是无意义的,就不会将它加入到重载候选集中。如果一个模板特例化版本会导致类型错误,它就被认为是无意义的。原创 2023-06-14 18:01:40 · 1016 阅读 · 0 评论 -
C++11 上下文关键字
熟悉C++11的朋友都知道,C++有大概83个左右的关键字。1、没什么难度,纯粹需要理解。原创 2023-06-13 15:28:56 · 554 阅读 · 0 评论 -
Ubuntu系统denyhosts的使用
今天服务器又被攻击了,防火墙也打开了,由于服务器需要对外提供服务,避免不了开放几个外部端口,所以增强防护才是王道。翻开/var/log/auth.log的日志发现很多外国的ip再请求我的端口,庆幸的是都被拒绝掉了,这应该是反复实验端口并试图找到漏洞。我准备增加denyhosts的服务,自动将一些外部攻击给加到黑名单里面。1、总体没那么难,不明白的设置就维持默认2、有问题的可以评论,我会看到邮件。原创 2023-06-07 13:37:08 · 881 阅读 · 0 评论 -
C++ new和delete的使用
new和delete是C++里非常重要的两个关键字,意味着从“自由存储(堆)”分配指定大小的内存和释放掉这些内存。这些用法哪怕初学者也会,但是今天要讲的不是这个。今天要讲的是使用中容易忽视的细节和可能引发的错误首先,new和delete总是成对出现,顺序也不能错。一定是先new再delete。其次,new和delete是针对单个对象,还有new[]和delete[]针对数组。最后,我们先从最简单的使用开始,慢慢带入。new和delete还可以操作自定义对象。struct t {原创 2023-06-06 15:00:15 · 5634 阅读 · 0 评论 -
C++使用unique_lock实现多重锁机制
现代的计算机性能很强大,可以实现多线程并发。随之而来引入了另一个问题:“数据竞争”,这个问题是并发编程必须面对的。还有一种情形,当我们需要同时满足获取多个锁才能进行下一步操作该怎么办呢?最简单的方法是定义3个mutex,依次lock(),当全部满足的时候再进行下一步。看起来似乎可行,但是对于场景比较复杂的情况可能引来一个非常危险的后果“死锁”:想想那样一种场景,你所需要的锁也同样被其他很多线程需要,随着锁的数量增加,“死锁”的概率随之增大,无形之中增加了风险。原创 2023-06-02 15:28:44 · 1484 阅读 · 0 评论 -
C++由于错误使用下标运算符引发的未定义错误
本节讲一个由于下标使用错误引发的未定义错误,看似很简单的一个错误,可能反而在开发中会出错。1、整体不难,但是一不小心就出错。2、优先使用标准库替代,增强可移植性和强保证。原创 2023-05-24 16:48:59 · 728 阅读 · 0 评论 -
C++枚举解读(enum)
对于开发C++来说,枚举是一个几乎必然用到的功能。当然今天要讲的枚举肯定不是平常漫不经心的使用,而是从里到外地深扒它,逐渐揭开它神秘地面纱,发现一些未曾注意到地东西。枚举值的默认值是有规律的,如果不能满足你的需求,就自定义值建议使用枚举类,副作用比较小。主要是名字空间污染的问题,可能一不小心就会引发其他的问题。原创 2023-03-02 15:32:06 · 9155 阅读 · 0 评论 -
C++ 普通旧数据解读(POD)
在开发C++的时候,使用对象是绕不开的话题。很多时候我们关注点都在对象的“高级语义”上,比如“运行时多态”,用户自定义的拷贝语义等。想象这样一种场景,给你一个含有100个对象的数组让你拷贝一份副本,正常的操作肯定是调用100次拷贝构造,但是你有没有想过一种方法,可以像拷贝char型数组那样使用内存拷贝呢?没错,这就是我们今天要讲的“普通旧数据”,简称POD。普通旧数据就是内存中的连续字节序列,是能够被“仅当作数据”处理的对象,程序员无须顾及类布局的复杂性以及用户自定义的构造、拷贝和移动语义。原创 2023-03-02 13:53:44 · 328 阅读 · 0 评论 -
C++引用合并(引用的引用)
最近做一个项目,遇到了C++的引用合并,到底是怎么回事呢?我们一起来看看。还是蛮简单的,记住原则就不会搞错了。原创 2023-03-02 11:25:30 · 184 阅读 · 0 评论 -
Clion安装Platformio支持
最近在研究一些微控制器芯片,然后发现每一个芯片都有一个自己的IDE,使用起来还是蛮废脑子的。比如树莓派Pico使用的是thonny开发micropython;Arduino使用的是Arduino IDE;Arm使用的是keil。我决定使用Clion+platformio的组合解决一些问题。1、总体来讲不是太难。原创 2023-02-23 16:28:23 · 1294 阅读 · 2 评论 -
explicit specialization of non-template
相信很多人在使用C++模板特例化都遇到过这个错误,很多人不知道原因甚至一头雾水,接下来我就用这篇文章解释下出现这个错误的原因。模板的所有特例化版本都应声明在与主模板相同的名字空间中。如果某个特例化版本被使用,而且它是显式声明的,则它必须显式定义。换句话说,显式特例化一个模板就意味着编译器不再为此特例化版本生成其它定义。原创 2023-01-05 13:24:58 · 377 阅读 · 0 评论 -
Ubuntu内核打开硬件watchdog
最近在部署linux系统的时候发现一个问题,kernel出现超时未响应。瞬间一万只草泥马奔腾,我心想内核这么强大的东西出现bug也能被我撞到,不管你信不信内核不是万能的,只要是人写的东西就有bug。所以我经过刻苦钻研终于成功打开了watchdog,而且是硬件的watchdog。本文使用的设备是firefl的aio-rk3399c,其他的设备可以参考我的方法,并结合一些钻研精神。关于怎么打开软件watchdog请参考我的另一篇文章linux watchdog配置。原创 2022-11-29 18:17:22 · 3019 阅读 · 1 评论 -
Linux watchdog配置
好久没写文章了,最近遇到一个蛋疼的问题,Linux内核假死的情况,简而言之就是内核在工作的过程中突然进入一种未知状态,不能正常工作了。watchdog主要有两种:第一种是硬件支持的,第二种是纯软件的。今天我们主要讲第二种,纯软件实现的。1、配置过程不算太难,但还是需要研究下2、特别需要注意的是,软件看门狗的稳定性有待挖掘,其本身会不会被内核杀死依然是一个谜,我觉得是有这种可能性的。遗憾的是我目前还没有模拟出来软件看门狗被杀死的情形,这个问题暂时留着。3、建议软硬件搭配使用,防患于未然。原创 2022-11-24 18:00:39 · 6950 阅读 · 13 评论