- 博客(78)
- 收藏
- 关注
原创 C++:6.编译加载过程的进一步说明
文章摘要: 程序编译过程分为预处理、编译、汇编和链接四个阶段。预处理进行文本替换和宏展开;编译检查语法并生成汇编代码;汇编将代码转为机器指令,生成包含段信息和符号表的目标文件;链接合并目标文件,完成地址重定位和动态库加载。主要报错发生在编译(语法错误)和链接阶段(符号冲突或缺失)。通过readelf、nm、patchelf等工具可查看目标文件结构、符号表和动态库信息。动态库通过soname标识实现版本兼容,运行时由ld-linux动态链接器加载依赖库并完成地址重定位。
2026-08-01 16:54:19
285
原创 C++:2.工厂模式
本文介绍了使用工厂模式解决不同厂商相机SDK集成问题的实现方案。通过定义抽象相机基类ICamera,将通用接口与厂商特定接口分离;针对不同厂商(如DS、DH等)实现具体子类;再通过工厂类ICameraFactory及其子类创建具体相机实例,最后由CameraFactoryManager统一管理。这种设计降低了代码耦合性,避免了为不同厂商重复编写业务逻辑,使系统更易扩展和维护。工厂模式有效处理了相同功能接口但实现方式不同的问题,提高了代码复用性和可维护性。
2026-07-22 16:25:32
281
原创 C++:工具类的几种实现方式
C++工具类实现方式主要有三种:1)单例模式,通过静态实例保证唯一性,适合需初始化的场景;2)静态成员函数方式,禁用构造函数确保仅通过类名调用;3)命名空间方式,使用inline函数避免多重定义,将相关函数组织在统一命名空间下。三种方式分别适用于不同场景,可根据需求选择实现全局工具类。
2026-07-21 16:10:01
186
原创 C++:1.单例模式
单例模式是一种确保全局唯一实例的设计模式,适用于工具类等场景。实现核心是将构造函数私有化,并禁止拷贝/赋值操作。C++中主要有三种实现方式:1)饿汉式-静态成员变量在main前初始化,线程安全但可能浪费资源;2)懒汉式-包括非线程安全的简单版和带双重检测+锁的安全版;3)C++11推荐的静态局部变量方式(Meyer's Singleton),首次调用时创建且线程安全,是最简洁高效的实现。三种方式均通过getInstance()获取唯一实例,其中静态局部变量方式无需额外锁机制,是当前最佳实践。
2026-07-21 15:42:08
337
原创 C++:常用的设计模式
比如当项目配置文件发生变化时候,不需要重启程序,就可以加载已修改的数据,就是通过观察者模式实现。但在实际业务中,生产者-消费者这种模式使用频率很高,而且很好用。像Java中的各种消息中间件,就是典型的生产者-消费者模式。工厂模式的目的,是为了解决,有一个协议接口,但不通厂家有不同实现方式等一系列类似问题。而到了C++11后,由于静态局部变量自带线程锁,所以通过静态局部变量来实现单例模式,成为最优解。C++的设计模式有很多,网上介绍的大概有23种。工程模式又可分为简单工厂模式、工厂模式、抽象工厂模式。
2026-07-17 19:01:10
230
原创 C++:5.编译加载过程
本文详细介绍了C++代码从编译到执行的五个主要步骤:预编译(清理注释、宏替换、插入头文件等)、编译(语法检查与优化)、汇编(生成二进制指令与符号表)、链接(合并段、符号解析、重定位)以及加载运行(虚拟地址映射、动态链接、初始化等)。最后提到可通过gcc/g++的-o选项一键完成编译链接生成可执行文件。整个过程涉及预处理指令、目标文件格式、静态/动态链接等核心概念,完整展现了源代码到可执行程序的转换流程。
2026-07-17 14:52:30
298
原创 C++:4.static之成员变量/函数
只要带有static关键字,不管是静态局部变量,还是静态全局变量,还是静态成员变量,其存储位置都是在内存中的全局区/静态区,生命周期和整个程序保持一致。对于静态成员变量来说,它不属于类对象,而是属于类本身,所有类的实例共享同一个变量。初始化时,在类内声明,类外定义。
2026-07-11 17:31:25
199
原创 C++:3.static之常量
本文对比了C++中两种常量定义方式。测试发现const与static const在全局作用域表现相同,可能因编译器优化导致;extern声明可跨文件使用const常量,C++17后可用inline简化定义。#define宏定义是纯文本替换,缺乏类型检查,容易引发错误。综合来看,const修饰变量比宏定义更安全可靠。
2026-07-11 15:40:28
185
原创 C++:2.static之变量
C++变量作用域与生命周期总结 C++变量分为局部变量(函数/代码块内定义,栈存储,函数生命周期)、静态局部变量(static修饰,全局区存储,程序生命周期,C++11后线程安全,适合单例模式)、全局变量(函数外定义,全局区存储,跨文件需extern声明)和静态全局变量(static修饰,仅当前文件有效)。静态变量(局部/全局)存储在全局区,生命周期与程序一致,但作用域不同。全局变量需避免多重定义,静态全局变量具有文件隔离性,适合内部使用。局部变量需注意栈溢出风险,未初始化时为随机值。
2026-07-10 13:20:14
231
原创 C++:1.内存模型划分
本文介绍了C++程序的内存模型及其与磁盘文件的对应关系。内存分为五大逻辑区域:堆(动态分配变量)、栈(局部变量和参数)、全局/静态存储区(初始化和未初始化的全局/静态变量)、常量存储区(字符串常量和const常量)和代码区(只读的二进制代码)。其中,.text、.rodata、.data和.bss段内容会打包到可执行文件中,而堆栈在程序运行时才创建。程序加载时,操作系统将这些段映射到对应内存区域,其中.bss段会被清空以赋予默认值。
2026-07-09 15:35:14
354
原创 TCP专栏-4.四次挥手
摘要:TCP断开连接采用四次挥手机制,确保双向连接可靠终止。客户端发送FIN后进入FIN_WAIT_1状态,服务端响应ACK进入CLOSE_WAIT;服务端完成数据传输后发送FIN进入LAST_ACK,客户端确认后等待2MSL(最大报文生存时间)进入CLOSED状态。2MSL等待确保:1)服务端重传FIN能被处理;2)旧连接残留报文失效,避免干扰新连接。特殊场景下(服务端无数据待发),通过合并ACK和FIN报文可实现三次挥手。该机制平衡了连接终止的可靠性与效率。
2026-06-09 17:13:57
277
原创 TCP专栏-3.三次握手
三次握手是指,在建立TCP连接时,客户端和服务端总共会发送三个数据包。只有三个数据包都发送成功后,TCP连接才会建立成功。否则,丢失任何一个包,都会导致连接建立失败。发送三个数据包的过程,被人形象的称为三次握手。
2026-05-07 14:53:50
403
原创 TCP专栏-2.TCP报文格式
本文简要介绍了TCP报文格式及其解析方法。首先指出所有计算机数据最终都以二进制形式传输,TCP报文也不例外,但在实际应用中通常转换为16进制便于分析。文章通过示例报文展示了TCP报文的组成结构,重点解释了关键字段:源/目的端口(16位)、序列号/确认号(32位)、首部长度(4位)、标志位(6位)和窗口大小(16位)。其中标志位包括URG、ACK、PSH、RST、SYN、FIN等控制位,窗口大小则用于流量控制。文章强调TCP报文格式的方块图是为了直观展示二进制数据的组织结构,帮助理解协议规范。
2026-05-05 17:17:25
438
原创 TCP专栏-1.TCP协议概念说明
摘要:作者回忆初学TCP协议时的困惑,从对二进制传输、SYN报文等基础概念的迷茫,到后来重新理解TCP本质的心路历程。文章用通俗比喻解释TCP的核心特性:面向连接(如打电话需双方准备)、可靠性(通过应答机制保证)和字节流传输(数据按序编号)。同时阐明TCP作为传输层协议在网络分层模型中的定位,强调其通过端口区分应用程序的特性。作者希望通过分享自己的学习经验,帮助初学者避免类似困惑,建立对TCP协议的正确认知框架。
2026-04-30 17:44:16
330
1
原创 QT:语言翻译
本文介绍了在QT项目中实现多语言切换的两种方案。方案1通过手动设置控件文本实现,虽然简单但维护困难;方案2利用QT自带的翻译功能,通过.ts和.qm文件实现多语言支持,更具扩展性。文章详细说明了翻译文件的生成流程、QT内部加载机制(setupUi和retranslateUi函数),并提供了完整的代码实现示例。特别针对lineEdit控件在翻译时值被重置的问题,给出了解决方案:取消其text属性的可翻译选项。该方案通过配置文件管理翻译内容,新增语言只需修改配置文件而无需改动代码,大幅提高了可维护性。
2026-04-23 15:35:27
538
原创 字节-6.串口通讯
本文介绍了串口通讯协议的设计与实现方法。协议包含帧头、站号、命令地址、业务数据和校验码等字段,采用16字节固定长度格式。详细说明了指令计算方法,包括振动器和灯光控制的具体指令示例。针对串口通讯中的粘包和拆包问题,给出了基于QT的发送和接收代码实现方案,其中发送部分包含CRC校验、指令组装等功能,接收部分通过帧头判断和固定长度处理来解析数据。对于不定长数据的情况,建议预留长度字段来实现正确解析。
2026-01-20 16:37:51
650
原创 字节-5.base64原理解析
Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,主要用于小文件网络传输、跨语言通信等场景。其原理是将3字节二进制数据分为4个6位组,映射到64个字符表(A-Z,a-z,0-9,+,/)上,编码后数据量增加约33%。文章提供了C++实现的Base64编码解码代码,包括二进制转Base64、Base64解码两种实现方式,适用于处理小文件传输和跨平台数据交换需求。
2026-01-18 12:29:02
330
原创 字节-4.char/unsigned char/string对比
本文比较了char、unsigned char和string在处理字节流时的异同:1) char适合存储ASCII文本(-128~127),unsigned char适合单字节16进制数据(0~255),底层存储相同但显示不同;2) char[]可存储二进制数据,但C字符串函数会因\0截断,应使用固定长度读取;3) string封装了char[],解决了\0截断问题,可同时处理文本和二进制数据;4) std::vector<char>也可用于二进制存储,功能类似string。
2026-01-16 18:05:16
116
原创 字节-3.字节的深入说明
本文深入探讨了字节和二进制数据在不同编程语言中的处理方式。通过对比char、int等数据类型的字节占用情况,说明相同数据在不同类型变量中存储和解析的差异。文章详细分析了printf和std::cout在打印数值、字符时的不同表现,指出底层二进制存储相同但上层解析方式会影响输出结果。同时阐述了进制转换原理,以单字节、双字节和四字节为例,计算了不同进制下的数值范围,并比较了有符号和无符号类型的区别。这些概念对理解编程语言中数据类型和底层存储的关系具有重要意义。
2026-01-16 14:40:01
1080
原创 字节-2.位运算
本文介绍了位运算的基本概念与应用。主要内容包括:1)常用位运算符(与、或、异或、取反、移位)的功能及示例;2)有符号数的原码、反码和补码表示方法,重点说明补码如何将减法转化为加法运算;3)掩码的概念及其在位操作中的应用,包括提取特定位和拼接数据。文章通过具体数值示例(如52和-52的补码转换)演示了位运算原理,并提及了掩码在OpenCV等领域的实际应用。
2026-01-14 19:00:43
320
原创 字节-1.基础概念
本文介绍了计算机通信中的基本概念:1)位(bit)是计算机最小存储单位,取值为0或1;2)字节(byte)是编程语言最小单位,1字节=8位;3)字符需编码为字节存储;4)ASCII码将英文字符数字化;5)进制是数的不同表示方式;6)高低字节是数据的固有属性;7)大小端序是字节传输顺序的两种方式;8)数据传输模式分为单工(单向)、半双工(双向交替)和全双工(双向同步)。这些概念构成了计算机数据存储和通信的基础。
2026-01-14 18:01:29
513
原创 Elasticsearch专栏-9.springboot集成es
pom添加依赖 <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.14.0</version> </dependency> <depende
2022-05-19 09:08:39
479
原创 Elasticsearch专栏-2.es环境安装
安装说明es分为单机版和集群版,会分别进行说明。es的查询我们使用kibana,也会安装。es默认的分词插件,对中文分词效果不好。推荐使用ik,这里顺手也给安装上。es和kibana的版本号要一样。组件版本下载地址es7.14.0https://mirrors.huaweicloud.com/elasticsearch/7.14.0/kibana7.14.0ik8.1.0https://github.com/medcl/elasticsearch-
2022-04-11 19:29:27
1792
原创 jmeter-常用函数
1.全局uuid${__UUID}2.随机数${__Random(1,300,)}3.指定范围,生成时间"${__RandomDate(,2022-03-01,2022-03-30,,)} ${__Random(10,22,)}:${__Random(10,59,)}:${__Random(10,59,)}"4.当前时间-uninx时间戳,毫秒${__time(,)}5.当前时间-uninx时间戳,秒${__time(/1000,)}6.指定...
2022-03-04 14:24:54
942
原创 服务器带宽及网络流量发送、接收速度测量
带宽测试工具:iperf1.下载地址https://github.com/esnet/iperf2.安装tar -zxvf iperf-3.9.tar.gz./configuremake && make install3.启动服务端:iperf3 -s客户端:iperf3 -c 192.168.88.206测试带宽在93M左右,内网局域网为100M,基本吻合。其中-b 100M也可以不带。流量测量工具:iftop、nethogs..
2021-07-27 19:17:33
1774
原创 springboot整合dubbo
1.什么是rpc要知道什么是rpc,就要了解rpc产生的背景,这就涉及到进程通信问题。在单体时代,系统所有功能都集中一起,本地方法直接调用接口,简单方便。而在微服务时代,原本单独系统被分割为多份,一个系统中的方法不可能直接被另外一个系统调用。为解决这个问题,就引入所谓的远程调用,像socket、tcp/udp、http等都属于远程调用。tcp和http底层也是基于socket实现,再调用时候,需要做很多工作,像tcp的报文设置、黏包处理,http的请求头设置、返回解析等。虽然能实现远程调用,但使
2021-07-23 18:03:48
2973
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅