C++
文章平均质量分 61
王健
无言
展开
-
萃取的实现(一)
name所有元素之和为负值,很明显是和超出了char所能表示的范围。所以对数组求和,和的数据类型的表示范围要大于数组的数据类型的表示范围。因此源码中total的类型不能是T。原创 2024-10-16 14:01:42 · 918 阅读 · 0 评论 -
模板基础术语
声明指将名称(变量,函数,类或结构体)引入或再次引入到一个作用域内。声明包含名称的一部分类别,但不需要其太多细节信息。class C;定义对于变量,函数,类或结构体是不一样的。对于变量,如果进行了初始化,或者未使用extern,声明就变成了定义。如果进行了初始化,即便使用extern修饰,也属于定义,但会触发警告“'extern' variable has an initializer [-Wextern-initializer]”原创 2024-08-09 13:12:25 · 297 阅读 · 0 评论 -
按值传递还是按引用传递
从 C++11 开始,可以让调用者自行决定向函数模板传递参数的方式。执行过程中,会发现sum并没有按引用传递,而是按值传递。很明显,这不符合预期。原创 2024-05-10 14:23:41 · 468 阅读 · 0 评论 -
std::invoke解析
std::invoke是c++17标准库引入的一个函数模板。这个函数模板能做什么?原理是什么?先来看一个简单的例子,回答std::invoke“能做什么”。通过上面的例子,可以看出,std::invoke仅仅是对函数指针的调用做了一下封装,这种技术被称作。单从上面的例子来看,std::invoke的存在没有任何意义:直接调用函数更加方便,效率也更高,而通过std::invoke调用并不能带来任何收益。在这个例子中,std::invoke似乎不可取代。原创 2024-05-07 14:54:09 · 1000 阅读 · 1 评论 -
移动语义和enable_if<>
c++11引入了一个新的模板函数——std::forward,用于实现完美转发,即强制参数以右值形式转发。为什么要引入这样一个模板?当执行g(X())和g(std::move(x))时,g(X &&x)理想地情况下是调用f(X &&x),但实际上却调用了f(X &x)。之所以会这样,是因为C++编译过程中发生了(关于这一概念,可以参考通过使用std::forward,可以消除std::forward的实现。原创 2024-04-19 18:32:38 · 509 阅读 · 0 评论 -
C++模板基础技巧
当提到typename关键字时,首先想到的便是和class关键字一样,定义模板时引入一个模板参数,但除此之外,typename关键字还拥有另外一个功能——消除歧义:指明模板内部的一个标识符代表的一种类型,而不是一个静态成员,例如:typename T::SubType * ptr表示定义一个类型为T::SubType的指针变量,而不是T类型的静态成员变量和ptr相乘。错误的意思是“为什么必需要使用typename关键字?这与模板的编译机制有关。原创 2024-03-30 18:26:46 · 577 阅读 · 0 评论 -
C++变参模板
从c++11开始,模板可以接受一组数量可变的参数,这种技术称为变参模板。原创 2024-03-10 18:12:43 · 955 阅读 · 0 评论 -
非类型模板参数
通常它们只能是整形常量(包含枚举),指向 objects/functions/members 的指针,objects 或者 functions 的左值引用,或者是 std::nullptr_t (类型是 nullptr)。但是个人始终觉得这个说法有些勉强,非模板类型参数的类型设置为uint64_t,无论10,还是1000,都是用uint64_t,会有什么问题么?非类型模板参数在c++中的使用场景还是比较多的,例如:std::array,std::get(读取std::tuple)。原创 2024-03-05 14:20:43 · 260 阅读 · 0 评论 -
初识C++模板
尽管源码中仅有一个函数,但却实现了对多种类型的支持。再做一个实验,使用“g++ -S template.cpp -o template.s”生成汇编代码,仔细研究template.s(代码太长,此处不在粘贴),发现可执行程序名称包含max_函数,就是源码中的max_函数。方案二和方案三的本质是一样的,对原有数据类型进行封装,通过回调方式解决数据类型差异问题。从上面的实验推出,名称中包含max_的函数的生成,仅与实例的类型相关,与调用次数无关。实现一个算法:返回两个变量中的较大的一个,并支持不同的数据类型。原创 2024-01-18 20:11:58 · 1156 阅读 · 0 评论 -
利用std::unique_ptr释放资源
通过unique_ptr的定义(如下),其模板参数有两个 :_Tp为对象的类型;_Dp为对象的释放方法。在unique_ptr对象生命周期结束时,通过调用_Dp释放资源。默认的释放方法为default_delete,是一个仿函数,其通过delete释放指针。FileGuard使用unique_ptr定义了文件句柄自动释放的类型。unique_ptr是stl定义的一种智能指针,利用C++的RAII机制进行内存管理,防止内存泄漏。1.定义一个释放仿函数类型,必须实现operator()(T *ptr)原创 2023-12-24 18:55:39 · 691 阅读 · 0 评论 -
生产者-消费者C++实现(二)
上面代码实现了生产者——消费者基本功能,由于生产者(proucer_callback)和消费者(consumer_callback)都通过sleep控制了速度,没有出现产品缓冲区为空,而消费者一直循环获取互斥锁(没有产品消费,消费者在空轮,造成cpu资源浪费,影响消费者),而生产者没有机会获取互斥锁的情况,但实际情况不可能通过sleep去控制,这样将会使处理性能大打折扣。第一点需求是显然的,即便是在生产线程和消费线程速率相当的情况下,增加缓冲区也是有益的,这样能够减少生产者抖动(如网络)带来的影响;原创 2022-11-13 16:47:12 · 1642 阅读 · 0 评论 -
使用libevent实现简单http服务(二)
使用libevent实现高并发原创 2022-06-25 22:56:39 · 432 阅读 · 0 评论 -
使用libevent实现简单http服务(一)
使用libevent实现简单http服务原创 2022-06-25 15:19:38 · 921 阅读 · 0 评论 -
libevent之eventop
功能:IO处理模型架构:实现: event-internal.h定义eventop结构体,在.c文件实例化生成对应的全局对象,如在poll.c中生成pollops对象。event.c中定义eventop对象指针数组eventops,同是在event.c中event_base_new_with_config函数通过策略从eventops指针数组中选出一个对象指针,对event_base的evsel成员指针赋值。 注意,windows的iocp不在该架构...原创 2022-05-02 22:50:04 · 396 阅读 · 0 评论 -
使用libevent实现简单定时器
功能:使用libevent实现简单定时器,每10s触发一次流程:代码://简单定时器#include <event2/event.h>#include <stdio.h>#include <time.h>#include <assert.h>#include <signal.h>class simple_timer final{public: virtual ~simple_timer(voi..原创 2022-05-02 18:05:22 · 961 阅读 · 0 评论 -
GDB打印vector指定元素
使用GDB调试程序时,需要查看变量的值。对于普通变量,直接使用p命令即可,如下:对于vector,也可以使用相同的方法,如下:vector元素较少时,这种方法没有问题。但当vector数量上万时,这种方法就不是太方便了:查找自己想看的元素比较困难 有些元素被隐藏,看不到这种情况下,可以通过myvector._M_impl._M_start访问随机访问vector元素,_M_impl._M_start 为vector数据内容首地址,直接使用“p matrix._M_impl._M_..原创 2022-02-19 14:40:07 · 1681 阅读 · 0 评论 -
初识valgrind
valgrind是一款非常优秀的性能调优工具,经常使用到的模块主要有下面6个:Memcheck:内存错误检测Cachegrind:缓存和分支预测分析Callgrind:性能分析图Helpgrind:线程错误分析系Missif:堆分析DRD:线程错误分析如果使用valgrind,编译程序是尽量加上-g选项,这样valgrind的输出会包含行号,这样可以帮我们更方便地分析结果。...原创 2020-11-16 23:45:54 · 168 阅读 · 0 评论 -
程序性能优化之分支预测
程序是由多条指令构成的,程序的运行便是cpu一条一条执行程序指令的过程。一条指令的执行过程大致可以分为加载指令,翻译指令,加载数据,执行运算,更新数据几个阶段,每个阶段都由单独的运算单元去执行。为了提高性能,各阶段是并行执行的,即当前指令的流程到了执行运算阶段,下一条指令的流程有可能已经到了加载数据阶段。这样做至少有两个优点:单元复用和并行执行。即使同一个阶段,多条指令流程也是可以并行执行的,如执行运算阶段,加法运算和乘法运算时可以同时执行的。下图是一张现代cpu运算单元的简单模型(摘自《深入理解计算机系统原创 2020-11-08 23:14:38 · 740 阅读 · 0 评论 -
boost::any实现解析
忘记当初具体想做什么了,只记得要求:将各种类型(如int,char*,float,自定义类型等)放到一个容器里。这样的要求,目前stl的任何容器都是做不到的。因为容器仅仅能够存储同一种类型的对象,因此我们只能往代理的方向去考虑。一提到代理,大家首先想到的可能是继承:设计一个基类(如AnyType),其他的类型均从基类派生(如StringType,IntType,FloatType),容器里存储存储...原创 2019-11-22 15:36:37 · 686 阅读 · 0 评论 -
使用opencv 4.10报错 "CV_XXX":未声明的标识符
opencv 410全部使用C++接口,将枚举类型的定义全部挪到了命名空间cv内部。当编译报错找不到CV_XXX时,请使用cv::XXX代替。例如“error C2065: “CV_CAP_PROP_FRAME_HEIGHT”: 未声明的标识符”,请使用cv::CAP_PROP_FRAME_HEIGHT代替。“CV_FOURCC”: 找不到标识符,出现该编译错误,请使用cv::VideoWr...原创 2019-11-18 18:19:20 · 6893 阅读 · 1 评论 -
ffmpeg调用av_read_frame读取实时视频流返回AVERROR_EOF
自己所负责的模块中使用到了ffmpeg,一直都很正常。但最近碰到了个奇怪的问题,使用av_read_frame连续读取摄像头实时视频流,运行一段时间后,该函数会返回AVERROR_EOF,代码如下:void MediaSource::DataProvider::_RecvThread(void){ INFO_LOG(m_LogHandler, "recv thread ENTER, ur...原创 2019-10-29 18:24:25 · 11204 阅读 · 13 评论 -
消除unreferenced local variable警告
写代码时,函数里声明的局部变量有可能暂时用不到,但是由于某种原因,又不想删除,如下:int _tmain(int argc, _TCHAR* argv[]){ int *p; return 0;}这样直接便已,编译器会产生警告,如下:warning C4101: 'p' : unreferenced local variable当然,这也不是什么大问原创 2016-04-15 18:06:47 · 44401 阅读 · 0 评论 -
linux下调用mysql_query产生SIGSEGV段错误
程序需要用到MySQL来进行持久化,代码在windows测试通过,但在Linux调试时,产生下面的异常:Thread 9 "NodesManagerd" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7ffff2b08700 (LWP 9389)]原创 2017-03-01 14:39:46 · 1861 阅读 · 0 评论 -
linux不指定LD_LIBRARY_PATH运行程序
在windows中,只要将动态库DLL跟可执行程序放在同一个目录,程序在运行时,就能找到DLL。然而,在linux中,必须指定动态库的路径,程序才能找到动态库,即使可执行程序和动态库在同一个目录。举个例子,编写一个计算库,支持加减乘除,代码如下:calc.h////calc.h//#ifndef __CALC__#define __CALC__#if defined(__cpl原创 2017-03-09 18:18:34 · 1084 阅读 · 0 评论 -
stdbind剖析
stl算法库多数算法只能提供一个参数给绑定函数,如for_each函数。如果想打印vector中的每一个元素,用for_each实现方式代码如下:#include #include #include struct print{ void operator()(const int x){ std::cout << x << std::endl; }};int mai原创 2017-07-06 14:06:13 · 687 阅读 · 0 评论 -
解决使用libhdfs.so连接hdfs出错问题java.lang.ClassNotFoundException: org.apache.hadoop.fs.F
出现java.lang.ClassNotFoundException: org.apache.hadoop.fs.FileSystem错误的原因: libhdfs.so并没有直接与hadoop与hdfs直接交互,而是通过jni调用hadoop客户端jar包完成于hadoop的交互(不知这样说是否严禁)。所以如果调用libhdfs,必须将所有jar包添加到原创 2017-10-13 18:49:44 · 5185 阅读 · 0 评论 -
makefile入门
Makefile入门1. gcc常用编译命令 gcc最简单的编译命令就是gcc *.c,编译当前目录下的所有源文件。现在,假设目录say下面存在三个文件say.h(定义模块函数),say.c(实现模块函数),say_usr.c(调用模块函数),那么直接在目录say中执行下面的命令,便可以完成编译: gcc *.c 编译生成的二进制文件为a.out(默认原创 2017-10-31 19:09:13 · 435 阅读 · 0 评论 -
stl容器循环删除元素总结
程序中有一段代码是关于stl循环删除的内容,大体逻辑如下(实际逻辑要复杂的多,不适合用std::remove系列函数):int main(int argc, char **argv){ std::vector<int> vec{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; auto it_vec = vec.begin(); while (it_vec...原创 2018-12-20 17:22:40 · 679 阅读 · 0 评论 -
opencv加载内存中图片
opencv从磁盘加载一张图片非常简单,通过cv::imread即可,代码如下: cv::Mat src_mat = cv::imread("1.jpg"); //读取图片1.jpg,imread会将图片内容解码成yuv或rgb存放到Mat对象 cv::Mat dst_mat = src_mat(cv::Rect(100, 100, 1600, 900)); //获取图片固...原创 2019-02-01 17:05:26 · 8805 阅读 · 0 评论 -
生产者-消费者C++实现(一)
和同学闲聊,谈到多线程中的经典问题——生产者-消费者问题:要求实现两个线程,一个线程负责对全局变量进行+1操作,一个线程负责打印更新后的值。自己从事code多年,自以为对多线程了解深入,不假思索,写出了下面的代码:#include <iostream>#include <mutex>#include <thread>#include <iost...原创 2019-06-03 15:21:48 · 8794 阅读 · 2 评论 -
ffmpeg解码花屏问题
最近在做一个视频分析相关的产品,基本架构就是使用ffmpeg取流,cuda解码,然后调用算法进行分析,生成图片。但产品做完之后,发现生成的图片存在花屏问题。起初没有太在意,因为rtsp视频流底层使用的是udp协议,丢个一两帧数据,造成花屏是件再正常不过的事情(但忽略了这是在局域网内)。况且,已经将将解码和取流分开,做了一级缓冲,再优化的空间实在不是很大,再加上时间紧,实在抽不出时间来解决该问题。...原创 2019-08-12 20:27:41 · 17859 阅读 · 6 评论 -
C++ Lambda表达式的使用方法
C++ Lambda表达式的简单实用方法如下:#include #include #include #include /** lambda -> this */class LambdaTest{public: LambdaTest(void) : _x(0), _y(0) { } LambdaTest(int x, int y) : _x(x), _原创 2015-12-04 10:39:25 · 396 阅读 · 0 评论