设计模式3-工厂方法
简单工厂模式有个缺点,当我需要添加一件产品时,必须去修改工厂函数,违反了对扩展开放对修改关闭的原则。另外如果产品类型过多的话,工厂函数里if-else/switch-case将会非常长,难以维护,因此工厂方法应运而生。 工厂方法的思想为给定一个抽象工厂类,每件产品单独由一个工厂来生产,这个工厂继承了抽象工厂基类,当我需要添加一件产品时,只需要再增加一个工厂即可,实现了对扩展开放,对修改关闭 下面是一个工厂方法的例子,由简单工厂代码改造而来,我们将工厂设计为抽象类factory,不同型号的产品单独提供一个工厂类继承factory,需要什么型号的产品就造一个对应类型的工厂 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include <iostream>enum class model { su7, modelY, M7...
虚拟地址空间划分
以32位linux进程为例 当进程被操作系统加载时,操作系统会给该进程提供一块 0x00000000~0xFFFFFFFF 共4G大小的虚拟内存地址空间 0x00000000~0xFFFFFFFF 0x00000000~0xC0000000 : 用户空间 0x00000000~0x08048000 : 预留空间(不允许访问) .text .rodata : 代码段和只读数据区 .data : 数据段,存储已初始化且不为0的变量 .bss : 未初始化+已初始化为0的变量 .heap : 堆区 共享库 : 加载.so的地方 .stack: 栈区 : 命令行参数和环境变量 0xC0000000~0xFFFFFFFF : 内核空间 12345678910111213141516171819int gdata1 = 10;int gdata2 = 0;int gdata3;static int gdata4 = 10;static int gdata5 = 0;static int gdata6;int main() { int a = 12; in...
设计模式2-简单工厂模式
简单工厂模式一般用来构造一系列相同类型的产品,用基类提供接口,具体产品继承基类,工厂函数根据枚举生成不同产品,并返回基类指针 下面是一个简单工厂模式的例子,我们有一个基类car,car可以派生出小米su7,特斯拉,M7等具体型号的产品,创建一个工厂类factory,我们只需要告诉工厂需要的具体型号,工厂负责生产好产品并返回给我们基类指针 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include <iostream>enum class model { su7, modelY, M7};class car {public: virtual void info() = 0; virtual ~car(){};};class MiSu7 : public car{public: void info(...
设计模式1-单例模式
单例模式应该算是最简单的一种设计模式了,只需要提供一个static的getInstance方法,然后将构造函数以及赋值运算符全给删除,即可保证每次通过getInstance获取的是同一个对象。 但实际上,它只是把全局变量包装了一层,就像在花裤衩外套了一层西装,看起来好看点而已。忠告就是不要滥用单例模式,只有确实整个生命周期内只需要一个(例如日志模块)的场景才建议使用,否则单例对象会一直贮存在内存中,即使你已经不需要它 123456789101112131415161718192021222324252627282930313233343536373839#include <iostream>#include <utility>class Singleton {public: static Singleton* getInstance() { static Singleton instance; return &instance; } Singleton(const ...
H264结构详解
frame视频的一张图片就叫一帧,H264分为I帧,P帧,B帧。 slice一个frame可以切成多个slice,slice之间在解码过程中是相对独立的,能够限制产生花屏时的影响范围 NALUNALU = NAL HEADER + NAL Payload(slice data); NAL HEADERNAL HEADER = Forbidden_zero_bit(1bit)必须为0 + nal_ref_idc(2bit)重要程度,越大越重要 + nal_unit_type(5bit)NALU类型[0,31]; nal_unit_type = {6(SEI), 7(SPS), 8(PPS), 5(IDR帧), 1(非IDR帧), 28(FU-A分片)} NAL PayloadSODB编码器原始输出的比特流(非字节对齐) RBSPSODB + 补齐字节,凑齐到8bit整数倍(停止位1 + n个0) EBSPRBSP中的 0x00 00 XX (XX = {00, 01, 02, 03}), 替换为 0x00 00 03 XX NALU交界NAL...
pkg-config
前言pkg-config是一个命令行工具,用于提供库(libraries)的编译和链接信息 用法123pkg-config --list-all #查看所有支持pkg-config的库pkg-config --libs --cflags glib-2.0 # 名字就是本地/usr/lib/x86_64-linux-gnu/pkgconfig/*.pc的前缀 CMake集成pkg-config12345678910# 1. 引入 pkg-config 模块find_package(PkgConfig REQUIRED)# 2. 查找某个库,例如 libcurlpkg_check_modules(CURL REQUIRED libcurl)# 3. 使用查找到的变量target_include_directories(my_app PRIVATE ${CURL_INCLUDE_DIRS})target_link_libraries(my_app ${CURL_LIBRARIES})target_compile_options(my_app P...
ffmpeg SDK学习(4)
从 ffmpeg 接口到 x264 接口libavcodec/libx264.c 中定义了结构体 1234567891011121314151617181920212223242526const FFCodec ff_libx264_encoder = { .p.name = "libx264", CODEC_LONG_NAME("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), .p.type = AVMEDIA_TYPE_VIDEO, .p.id = AV_CODEC_ID_H264, .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_...
x264 - 高品质 H.264 编码器
x264_param_t12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719...
Docker学习
卸载123for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; donesudo rm -rf /var/lib/docker 安装12345curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.shsudo systemctl start dockersudo systemctl enable docker 普通用户添加执行权限1sudo usermod -aG docker $USER
perf火焰图
生成采集文件1sudo perf record -F 100 -p 1847 -g --sleep 30 -F 100: 每秒100次的采样率 -p 1847: 要采样的PID – sleep 30: 执行30秒 输出为perf.data 1perf script -i perf.data > perf.unfold 转为火焰图1234git clone https://github.com/brendangregg/FlameGraph.gitcd FlameGraph./stackcollapse-perf.pl perf.unfolf | ./flamegraph.pl > out.svg 结果














