自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(147)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 MySQL 中 UTF8和UTF8mb4的区别

1、我们先来看一个问题在utf8字符集中插入数据:mysql> insert into `user` values (4,'a楞', 0);ERROR 1366 (HY000): Incorrect string value: '\xE6\xA5\x9E' for column 'name' at row 1可以看到上诉的插入语句执行失败。思考下,这是什么原因导致的?2、UTF8和UTF8mb41)在MySQL 5.5.3之后,增加了UTF8mb4的编码mb4就是most by..

2021-09-14 11:28:25 281

原创 自动驾驶的纯视觉路线是否靠谱?

(一)文章素材摘参考数据参考|汽车ECU开发 微信公众号(二)正文1、自动驾驶分级目前公认的自动驾驶分级标准由SAE(SAE International,Society of Automotive Engineers国际自动机工程师学会,原译为美国汽车工程师学会)制定。按照SAE的分级,自动驾驶技术分为L0-L5共六个等级。L0代表没有自动驾驶加入的传统人类驾驶,而L1-L5则随自动驾驶的技术配置进行了分级。Level 0(无自动化):由人类驾驶者全权操作汽车,在行驶过程中可以得到警告..

2021-07-29 22:12:43 1056

原创 FFmpeg filter过滤器使用详解

1、FFmpeg过滤器简介FFmpeg filter 提供了很多音视频特效处理功能,比如视频缩放、截取、翻转、叠加等。FFmpeg有很多已经实现好的滤波器,这些滤波器的实现位于libavfilter目录之下,用户需要可以调用这些滤波器实现滤波。我们可以通过ffmpeg -filters命令查看FFmpeg支持的过滤器。FFmpeg常用的filter包括:scale:视频/图像的缩放;overlay:视频/图片的叠加;crop:视频/图像的裁剪;trim:截取视频的片段;rotate:以..

2021-07-29 11:20:25 10133

原创 视频编码流程详解

1、视频编码整体流程2、FFmpeg视频编码详细流程从本地读取YUV数据编码为H264格式的数据,然后再存入到本地,编码后的数据有带startcode。与FFmpeg示例音频编码的流程基本一致。3、关键函数说明(1)avcodec_find_encoder_by_name:根据指定的编码器名称查找注册的编码器。(2)avcodec_alloc_context3:为AVCodecContext分配内存。(3)avcodec_open2:打开编码器。(4)avcodec_send..

2021-07-28 12:19:03 5560

原创 音频编码流程详解

1、音频编码整体流程2、FFmpeg音频编码详细流程3、关键函数说明(1)avcodec_find_encoder:根据指定的AVCodecID查找注册的编码器。(2)avcodec_alloc_context3:为AVCodecContext分配内存。(3)avcodec_open2:打开编码器。(4)avcodec_send_frame:将AVFrame非压缩数据给编码器。(5)avcodec_receive_packet:获取到编码后的AVPacket数据,收到的pack..

2021-07-28 11:03:05 4853 1

原创 音视频解码流程详解

1、解码整体流程(1) 音频解码整体流程(2)视频解码整体流程2、FFmpeg音视频解码详细流程3、关键数据结构AVCodecParser:⽤于解析输⼊的数据流并把它分成⼀帧⼀帧的压缩编码数据。⽐较形象的说法就是把⻓⻓的⼀段连续的数据“切割”成⼀段段的数据。比如:ffmpeg-4.2.1\libavcodec\aac_parser.c AVCodecParser ff_aac_parser = { codec_ids = { AV_CODEC_ID_AAC }, pri..

2021-07-26 22:23:12 4005 3

原创 C++设计模式--Observer观察者模式

1、动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”–一个对象(目标对象)的状态发生变化,所有依赖对象(观察者对象)都将得到通知。如果这样的依赖过于紧密,将使软件不能很好的抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种文档的依赖关系。从而实现软件体系结构中的松耦合。2、模式定义定义对象间的一种一对多(变化 )的依赖关系, 以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。实例源码:红色模块为改良前,蓝色代码为改良后c..

2021-07-24 23:50:47 159

原创 C++设计模式--模板方法

1、含义概要定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。2、源码实例原始源码:class Library {public: void Step1() { //..... cout <<"Step1" << endl; } void Step3() { //..... cout <&lt..

2021-07-24 22:39:42 171

原创 C++并发与多线程编程--windows临界区、其他mutex互斥量

1、windows临界区临界区又称关键代码段,指的是一小段代码在代码执行前,它需要独占一些资源。1.1 相关函数(1)初始化程序中通常将多线程同时访问的某个资源作为临界区,需要定义一个CRITICAL_SECTION类型的变量,然后调用InitializeCriticalSection函数对变量进行初始化;函数原型:VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection );参数说明:lpCriticalSect..

2021-07-24 22:03:15 241 1

原创 C++并发与多线程编程--async、future、packaged_task、promise、atomic

1、std::async、std::future创建后台任务并返回std::async是个函数模板,用于启动一个异步任务,启动起来一个异步任务后,返回一个std::future对象,std::future是个类模板。启动异步任务,即自动创建一个线程并开始执行对应的线程入口函数,它可以返回一个std::future对象。std::future对象含有线程入口函数所返回的结果(线程返回的结果),我们可以通过调用future对象的成员函数**get()**获取。提供了一种访问异步操作的机制。int m..

2021-07-23 18:08:43 337

原创 C++并发与多线程编程--unique_lock

1、unique_lock概念unique_lock是一个类模板,工作中一般使用lock_guard(推荐使用)。unique_lock比lock_guard灵活,但效率差一些,内存消耗也多一些。一般用法:std::mutex my_mutex;//...............std::unique_lock(std::mutex) sbguard(my_mutex);2、unique_lock参数(1)std::adpot_lock前提:在此之前要先加lock。表示互斥量已经..

2021-07-23 17:20:49 210

原创 C++并发与多线程编程--互斥量用法

1、互斥量概念互斥量是个类对象。理解成一把锁,多个线程尝试使用lock()成员函数来加锁,只有一个线程能锁定成功。如果没有锁定成功,那么流程卡在lock()这里不断的尝试去锁住这把锁头。互斥量使用要小心,保护数据不多也不少,少了,没达到保护的效果,多了,影响效率。2、互斥量用法(1)lock(),unlock()lock() 和unlock()要成对使用,有lock(),必然有unlock()。不应该也不允许调用了一次lock(),却调用多次unlock()。std::mutex ..

2021-07-23 17:00:30 189

原创 C++并发与多线程编程--陷阱

1、传递临时对象作为线程参数//陷阱1void myprint1(const int &i, char *pmybuf) //解决方案:修改输入参数类型(const int i, const string &pmybuf){ std::cout << i << std::endl; //分析认为,i不是传进来的mvar的引用,实际是值传递。如果主线程detach了,也不影响子线程该参数 std::cout << pmyb..

2021-07-23 16:15:39 215

原创 C++并发与多线程编程--启动、结束、join、detach

1、线程的简单使用void myprint(){ cout << "线程开始执行" << endl; //... cout << "线程结束执行"<< endl;}#include <thread>//.....int main(){ thread mytobj1(myprint);//创建了一个线程,线程执行起点(入口)myprint();(2)myprint线程开始执行 mytobj1.join..

2021-07-23 15:15:39 489

原创 C++并发与多线程编程--概念简述

1、并发两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务。以往计算机,单核cpu,某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所谓的“任务切换” 并发的假象(不是真正的并发),这种切换(上下文切换)是要有时间开销的, 比如操作系统要保存你切换时的各种状态,执行进度等信息,都需要时间,一会切换回来的时候要复原这些信息。现在计算机有双核、4核、8核…出现了多处理器,能够实现真正的并行执行多个任务(硬件并发)。使用并发的原因:同时可以做多个事情,提到性能。..

2021-07-23 14:26:37 180

原创 C++智能指针详解

1、概述我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete。new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针;delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。动态内存管理经常会出现两种问题:(1)一种是忘记释放内存,会造成内存泄漏;(2)一..

2021-07-23 12:16:30 31207 15

原创 C++ 中的.hpp文件

1、*.hpp含义hpp其实质是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该cpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。特点:是Header Plus Plus 的简写。与.h类似,hpp是C++程序头文件 。..

2021-07-23 10:36:28 5301

原创 C++内存管理--详谈

1、简述内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。..

2021-07-23 00:13:14 1943 9

原创 C++浅拷贝和深拷贝

1、浅拷贝浅拷贝:又称值拷贝,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的。 举个简单的例子,你的小名叫西西,大名叫冬冬,当别人叫你西西或者冬冬的时候你都会答应,这两个名字虽然不相同,但是都指的是你。假设有一个String类,String s1;String s2(s1);在进行拷贝构造的时候将对象s1里的值全部拷贝到对象s2里。我们现在来简单的实现一下这个类:#include <iostream>#includ..

2021-07-22 22:41:04 2472 1

原创 C++11/14新特性--=default、=delete、tuple

1、概要=default、=delete:显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器不生成函数默认的缺省版本)。C++11中引进这两种新特性的目的是为了增强对“类默认函数的控制”,从而让程序员更加精准地去控制默认版本的函数。2、“=default ”类与默认函数C++中,当我们设计与编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数:(1)构造函数(2)析构函数(3)拷贝构造函数(4)拷贝赋值函数(operator=)(5)移动构造函数以及全局的..

2021-07-21 23:01:40 590 4

原创 C++11/14新特性--内存对齐

1、现象先看一段代码:struct s1{ char s; int i;}; struct s2{ int i; double d;}; cout << "-------basic type" << endl;cout << "sizeof(char) " << sizeof(char) << endl;cout << "sizeof(int) " << sizeo..

2021-07-21 20:01:08 581 3

原创 C++11/14新特性--右值引用、移动语义、完美转发

1、右值引用C++引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。(1)左值和右值C++中所有的是必然属于左值、右值二者之一。左值:指的是表达式结束后依然存在的持久化对象。右值:指的是表达式结束时就不再存在的临时对象。所有的具名变量或对象都是左值,而右值不具名。区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值。右值又分为将亡值和纯右值。纯右值:就是c++98标准中右值的概念,如非引用返回的函数返回的临时变量值;一些运算表达式,如1+2产生的..

2021-07-21 12:43:26 342

原创 CMake安装教程--Windows

1、CMake下载下载网址:https://cmake.org/download/根据系统下载对应的CMake版本:32位、64位系统选择对应的版本进行下载。比如 ,Windows为64位,则选择下载64位版本CMake。CMake Windows版本提供了两种形式的软件包:msi安装包和压缩zip绿色包。本文选择msi安装包进行安装说明。2、CMake安装(1)安装步骤如下图所示(2)可通过版本查看是否已经安装成功...

2021-07-21 09:35:32 736

原创 C++11/14新特性--强类型枚举

1、强枚举类型(1)问题引出在传统C++中,枚举类型并非类型安全,枚举类型会被视作证书,则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给除了检查,但并非所有),甚至枚举类型的枚举名字不能相同,这不是我们希望看到的。(2)解决方案C++11引入了枚举类型(enumaration class),并使用enum class的语法进行声明:enum class new_enum : unsigned int{ value1, value2, value3 = 1..

2021-07-15 11:24:47 561

原创 C++11/14新特性--面向对象增强、overide、final

1、委托构造C++11引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的:class Base{public: int value1; int value2; Base(){ value1 = 1; } Base(int value) : Base() { // 委托 Base() 构造函数 value2 = 2; }};int main(){ ..

2021-07-15 10:17:05 150 4

原创 C++11/14新特性--模板增强、variadic templates

一、模版增强1、外部模版1) 传统C++的问题传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要触发模板实例化。2)C++解决方法C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使得能够显式的告诉编译器何时进行模板的实例化。关键字:extern template class std::vect..

2021-07-14 20:29:18 717 7

原创 C++11/14新特性--区间迭代、初始化列表

1、基于范围的for循环1)基于循环的迭代写法int array[] = {1,2,3,4,5};for(auto &x : array){ std::cout << x << std::endl;}2)容器遍历 std::vector<int> arr(5, 100); //arr数组包含5个100的元素 //原来遍历方式 for (std::vector<int>::iterator i = arr.begin..

2021-07-14 17:45:24 258

原创 C++11/14新特性--类型推导 auto、decltype

一、概要在传统 C 和 C++中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖慢我们的开发效率,也让代码变得又臭又长。C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。这使得 C++ 也具有了和其他现代编程语言一样,某种意义上提供了无需操心变量类型的使用习惯。二、autoauto 在很早以前就已经进入了 C++,但是它始终作为..

2021-07-14 17:07:41 426

原创 C++11/14新特性--lambda、nullptr、constexpr、noexcept

一、lambda1、lambda函数特点lambda表达式是一种匿名函数,即没有函数名的函数;取而代之的多了一对方括号[];lambda函数还采用了追踪返回值类型的方式声明其返回值;匿名函数是由数学中的λ演算而来。在C++11中,lambda函数是inline(内联函数)。2、lambda语法定义[capture] (parameters) mutable ->return-type {statement} 其中:[capture] :捕捉列表。捕捉列表总是作为lambd..

2021-07-14 15:11:49 803

原创 linux内核源码分析笔记

一、内核源码目录结构1、Linux 内核源代码包括三个主要部分1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理、linux初始化等。2)非核心代码:例如库文件(因为 Linux 内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、 KVM(虚拟机技术)等。3)编译脚本、配置文件、帮助文档、版权说明等辅助性文件。2、内核源代码顶层目录结构:include/ :内核头文件,需要提供给外部模块(例..

2021-04-26 17:33:19 5395 2

原创 linux内核整体架构分析笔记

一、整体架构与子系统划分根据内核的核心功能, Linux 内核划分为 5 个子系统:Process Scheduler,也称作进程管理、进程调度:负责管理 CPU 资源,以便让各个进程可以以尽量公平的方式访问 CPU。Memory Manager,内存管理:负责管理 Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用 Memory 的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再..

2021-04-26 15:00:11 359 2

原创 linux内核编译

1、编译工具linux内核编译需要用到make、gcc编译工具。如果系统还没安装这些工具,可以通过以下命令安装:$ sudo apt-get install make$ sudo apt-get install build-essential2、源码下载在 内核源码下载上面,下载对应的 Linux 内核代码。3、编译步骤1) 解压$ xz –d linux-4.4.16.tar.xz$ tar xvf linux-4.4.16.tar2) 配置$ cp /bo..

2021-04-26 14:33:04 690

原创 Redis存储结构探究

一、概述主流的key-value存储系统,都是在系统内部维护一个hash表,因为对hash表的操作时间复杂度为O(1)。如果数据增加以后,导致冲突严重,时间复杂度增加,则可以对hash表进行rehash,以来保证操作的常量时间复杂度。那么,对于这样一个基于hash表的key-value存储系统,提出以下2个问题:1)如何提供这么丰富的数据结构呢?2)数据结构在内存中如何存储?本文,我们将讲解、演示redis的内存布局和数据结构。二、hash算法思考题:如果我们有一个k-v系统,并把该系..

2021-04-23 17:03:14 265

原创 ZeroMQ源码分析笔记之线程间收发命令

一、概述从ZeroMQ源码分析笔记之架构了解到,线程间通信包括两类:1) 一类用于收发命令,告知对象调用什么方法做什么事情,命令结构由command_t 结构体确定。2)socket_base_t 实例与session的消息通信,消息结构由msg_t确定。命令的发送与存储是通过mailbox_t实现的,消息的发送和存储是通过pipe_t实现。ZeroMQ线程可以分为两类:IO线程 和 zmq的socket。1)IO线程:像reaper_t、io_thread_t都属于这一类,特点:内含一..

2021-04-23 11:18:58 482

原创 ZeroMQ源码分析笔记之架构

一、概述ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象。提供跨越多种传输协议的套接字。引用云风的话来说:ZeroMQ并不是对一个socket的封装,不能用它去实现已有的网络协议。它不同于更底层的点对点通讯模式,它有自己的模式。有比tcp更高一级的协议。ZeroMQ并不一定基于tcp协议,也可以用于进程间和进程内通讯。它改变了通讯都基于一对一的连接的假设。ZeroMQ支持4种通讯模型1)一对一结对通讯用于支持传统的TCP Socke..

2021-04-22 18:32:16 701 3

原创 ZeroMQ的编译安装和使用实例

一、编译安装1.1 资料网址ZeroMQ官方文档网址:http://zguide.zeromq.org/page:all源码下载地址:http://download.zeromq.org/1.2 安装必须的库$ sudo apt-get install libtool$ sudo apt-get install pkg-config$ sudo apt-get install build-essential$ sudo apt-get install autoconf$ sud..

2021-04-22 16:37:38 1810

原创 nginx Handler模块开发过程整理

一、综述一般来说,在nginx中作为第三方开发者最可能开发的类型模块包括:handler,filter和load-balancer。handler模块主要是用来接受来自客户端的请求并产生输出的模块。也有说upstream模块实际上也是一种handler模块,只不过它产生的内容来自于从后端服务器获取的,而非本机产生的。在配置文件中,使用location指令可以配置content handler模块,当nginx系统系统的时候,每个handler模块都关联了同一个location,而实际上只有一个h..

2021-04-16 15:02:53 283

原创 nginx架构剖析

一、综述nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。nginx是以多进程的方式来工作,当然nginx也是支持多线程方式的,只是多进程是nginx的默认方式,也是应用主流方式。1、master进程master进程主要用来管理worker进程,包含:1)接收来自外界的信号。2)向各个worker进程发送信号。3)监控worker进程运行状态,当worker进程退出后(异常退出),会自动重新启动新的worker进程..

2021-04-15 18:06:57 584 1

原创 Redis协议规范

1、概述Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信。RESP具有如下特点:易于实现快速解析高可读性RESP可以序列化不同的数据类型,如整数、字符串、数组。还有一种特定的错误类型。请求将要执行的命令作为字符串数组从Redis客户端发送到Redis服务器。Redis使用特定数据类型的命令进行回复。RESP是二进制安全的,不需要处理一个进程传输到另一个进程的批量数据,因为它使用前缀长度来传输批量数据。客户端连接到Redis服务器,是创建TCP..

2021-03-30 12:28:50 206

原创 MySQL事务介绍及使用

1、什么是事务?在MySQL中,只有使用了InnoDB数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。事务用来管理Insert,update,delete语句。2、事务的特性事务必须满足4个条件(ACID)原子性( Atomicity, 或称不可分割性)一致性( Consistency)隔离性( Isolation, 又称独立性)持久性( Durability) 。2.1 原子性一个事务( transa..

2021-03-29 18:56:26 174

Google C++编程规范

现在编程风格在开发过程显得越来越重要,良好的编程规范不仅使得代码的可读可维护性变得更简单,也是编码人员自我修养的一种体现。《Google C++编程规范》一书详细阐述了C++开发过程中各种规范,值得借鉴、参考。

2017-08-16

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

TA关注的人

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