
C/C++
文章平均质量分 78
C++的一些知识和使用方法
小狮子安度因
个人站点:http://huangyanjie.com
展开
-
机器人上的DPDK使用思考
高效数据传输:确保机器人各个部件(如传感器、执行器、控制器等)之间的数据传输具有极低的延迟,以满足实时控制的需求。支持高速数据传输,以满足高清视频、大量传感器数据等多媒体信息的实时传输需求。可扩展:通信协议和接口应采用模块化设计,便于根据具体需求进行定制和扩展。确保通信方案能够与不同类型的机器人部件、传感器和执行器兼容,同时支持未来可能引入的新技术和设备。多协议支持:支持多种通信协议(如CAN、Ethernet/IP等),以满足不同应用场景下的通信需求。原创 2024-09-20 22:20:44 · 1568 阅读 · 0 评论 -
C++的拷贝构造,拷贝复制和析构
之前的Complex类没有写拷贝构造和拷贝赋值函数,编译器会加上默认的。要不要重写拷贝构造和拷贝赋值函数,就要看默认的那一套够不够用。如果是带有指针的类,用默认的那一套,会有很大的问题。原创 2024-08-21 21:55:12 · 583 阅读 · 0 评论 -
设计模式-模版方法
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些步骤。Template Method模式是一种非常基础的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Templater Method的典型应用。原创 2024-08-20 21:49:36 · 974 阅读 · 0 评论 -
设计模式-工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。Factory Method模式解决“单个对象”的需求变化。原创 2024-08-20 21:48:56 · 456 阅读 · 0 评论 -
Protocol Buffer详解
特点:原始内存中的数据结构可以二进制形式发送/保存,那么接收端要和发送端的内存模型、字节序等待保持一致。且扩展性不好。XML:XML占用大量空间,对它进行编码/解码会给应用程序带来巨大的性能损失。容易扩展,使得兼容之前的版本。但是在修改.proto文件时需要满足几个条件field_numrequiredfield_numfield_numfield_num如果满足这些条件,那么就能轻松的实现版本之间的兼容性。对于旧版本的代码,旧的版本会忽略掉新增的字段,而被删除的 optional。原创 2024-08-19 23:17:58 · 1193 阅读 · 0 评论 -
C++虚拟成员-虚函数
一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被正确调用。当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。原创 2024-08-12 19:42:48 · 918 阅读 · 0 评论 -
C++新特性-智能指针
的正确使用场景是那些资源如果可能就使用,如果不可使用则不用的场景,它不参与资源的生命周期管理。例如,网络分层结构中,Session 对象(会话对象)利用 Connection 对象(连接对象)提供的服务工作,但是 Session 对象不管理 Connection 对象的生命周期,Session 管理 Connection 的生命周期是不合理的,因为网络底层出错会导致 Connection 对象被销毁,此时 Session 对象如果强行持有 Connection 对象与事实矛盾。里的对象管理也是采用这个。原创 2024-08-12 19:40:44 · 1211 阅读 · 0 评论 -
协程(coroutine)的原理和使用
一个程序要真正运行起来,需要两个因素:可执行代码段、数据。CPU这些数据内容,我们一般将其称为 “上下文” 或者 “现场”。有栈协程的原理,就是从线程的上下文下手,如果把线程的上下文完全改变,即:改变寄存的内容,指向其他指令地址;改变线程栈的内存内容等等。这样的话,当前线程运行的程序也就完全改变了,是一个全新的程序。协程的实现分为有栈和无栈的方式,有栈的实现方式又是可以分为“独立栈” 和 "共享栈"的实现方式。原创 2024-08-11 22:59:18 · 484 阅读 · 0 评论 -
cmake基于语法和应用
CMake。原创 2024-08-10 22:26:54 · 1032 阅读 · 0 评论 -
Linux源码学习笔记01-Linux内核源码结构
是一个类Unix操作系统,但不是简化的Unix;不仅继承了Unix的特征,还有其他特性。原创 2024-06-16 23:16:44 · 918 阅读 · 0 评论 -
用户态协议栈02-arp reply实现
在上一节中发送udp包的时候,需要向物理机的arp表中添加一个静态的arp记录。这在生产环境中显然是不可以的。在内核的协议栈中,会将自己的ip和mac在局域网中进行广播,并且记录其他电脑的ip和mac。在需要发送数据包的时候,查询arp表来获取目标的地址构建发送数据包。在实现arp reply之后,dpdk可以回复收到的arp数据包,让对方在arp表中添加一条动态的记录,这样就不需要添加静态的arp记录了。原创 2024-06-16 23:31:08 · 1237 阅读 · 0 评论 -
Linux源码阅读笔记02-进程原理及系统调用
他是独立运行在内核中的进程,与普通用户进程区别在于内核线程没有独立的进程地址空间。task_struct结构里面有一个成员指针mm设置为NULL,他只能运行在内核空间通常被称为守护线程。Linux通过:ps输出当前系统的进程状态。显示瞬间进程状态,不是动态连续;如果想动态连续,使用top命令。系统调用就是应用程序进入内核空间执行任务,比如:创建进程、文件IO等等。将进程抽象为进程控制块(PCB,Process Control BLock),Linux内核中使用。结构描述进程控制块。运行应用程序时,调用。原创 2024-06-17 07:02:02 · 1099 阅读 · 0 评论 -
Linux源码阅读笔记03-调度器及CFS调度器
完全公平调度算法体现在对每个进程都是公平的,让每个进程都运行一段相同的的时间片,这就是基于时间片轮询调度算法。古国一个进程得以执行,随着时间的不断增长,他的vruntime也会不断增大,没有得到执行的进程vruntime保持不变。调度器:Linux内核中用来安排调度进程(一段程序的执行过程)执行的模块成为调度器,他可以切换进程状态。在一个调度周期里,所有进程的虚拟运行时间是相同的,所以在进程调度时,只要找到虚拟运行时间最小的进程调度即可。指向红黑树最左边的调度实体,即虚拟时间最小的调度实体。原创 2024-06-18 10:42:58 · 766 阅读 · 0 评论 -
Linux源码阅读笔记04-实时调度类及SMP和NUMA
对称多处理器结构(symmetrical mulit-processing,SMP),在对称多处理器系统中,所有处理器的地位都是平等的,所有CPU共享全部资源,比如内存,总线,中断及IO系统等等,都具有相同的可访问性,消除结构上的障碍,最大的特点是共享资源。NUMA是多处理器计算机,系统各个CPU都有本地内存都可以支持超快的访问能力,各个处理器之间用总线链接,支持对其他CPU的本地内存访问(但是访问比自己内存慢一点)。多处理器系统中,内核需要额外考虑几个问题,确保良好调度。原创 2024-06-21 00:16:20 · 1015 阅读 · 0 评论 -
用户态协议栈03-icmp实现
ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP(Internet Control Message Protocol)Internet控制。这里我们依然是做的基础的回复包,效果是使用物理机进行。操作的时候,可以收到数据返回,所以我们只是打了一个。控制消息是指网络通不通、协议簇的一个子协议,用于在IP。原创 2024-06-21 00:18:40 · 502 阅读 · 0 评论 -
用户态协议栈04-定时arp-table的实现
后续对当前代码进行一些架构优化,并且添加别的协议,tcp还是比较麻烦的昨天去面试,是一家头部的智能家具公司。虽然说应该是过了,但是回答的比较业余,要把八股文提上日程了哈哈哈。原创 2024-06-22 03:02:01 · 1088 阅读 · 0 评论 -
用户态协议栈05—架构优化
用户态协议栈05—架构优化。原创 2024-06-22 03:03:14 · 638 阅读 · 0 评论 -
用户态协议栈06-TCP三次握手
最近由于准备软件工程师职称考试,然后考完之后不小心生病了,都没写过DPDK的博客了。今天开始在上次架构优化的基础上增加TCP的协议栈流程。百度百科:TCP即传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于的传输层通讯协议。这里最需要关注的就是,在我们使用Linux的Posix API创建TCP的Socket时,我们通常会这样操作:其中的参数的意思就是创建流式套接字。在写UDP的时候,只需要单纯的发送一个一个报文就可以,因为UDP是面向数据包的。TCP原创 2024-06-23 02:10:30 · 1209 阅读 · 0 评论 -
Makefile实战论(一)
为什么写这个呢,其实我有系统学过Makefile和CMake。但是因为用的不是很多或者说没有深入的使用场景,导致我不是很熟练,或者说没法优雅地使用。刚好最近对Linux的嵌入式编程比较感兴趣,借着demo来分析一下资深工程师写的Makefile,学习一下。由易到难吧,先来第一个,是一个GPIO的Makefile。原创 2024-06-23 02:11:30 · 767 阅读 · 0 评论 -
Linux源码阅读笔记05-进程优先级与调度策略-实战分析
如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO 时必须等待该进程主动放弃之后才可以运行这个优先级相同的任务。而 RR 可以每个任务都执行一段时间。(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE),始终返回0,即普通任务调度的函数。实时调度策略(SCHED_FIFO/SCHED_RR)优先级最大值为99;支持优先级使用,它们分别为 1-99,数值越大优先级越高。它 不 支 持 优 先 级 使 用 , 而。设置和获取优先级的2个主要核心参数。原创 2024-06-23 02:43:33 · 417 阅读 · 0 评论 -
RPC远程调用
RPC 即远程过程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起远程调用。RPC 凭借其强大的治理功能,成为解决分布式系统通信问题的一大利器。gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2+PB 保证了的高性能。tars 兼容grpcbrpc也兼容grpc。原创 2024-06-24 18:45:11 · 1704 阅读 · 0 评论 -
Linux源码阅读笔记06-RCU机制和内存优化屏障
在编程的时候,指令一般不按照源程序顺序执行,原因是为了提高程序性能,会对他进行优化,主要分两种:编译器优化和CPU执行优化。优化屏障避免编译的重新排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。RCU记录所有指向共享数据的指针使用者,当要修改共享数据时,首先创建一个副本,在副本中修改。内存屏障(也称内存栅障或屏障指令等),是一类同步屏障指令,是编译器或CPU对内存访问操作的时候,严格按照一定顺序来执行,也就是。在整个操作过程中,要防止编译器和CPU优化代码执行的顺序。原创 2024-06-25 18:46:03 · 1249 阅读 · 0 评论 -
Linux源码阅读笔记07-进程管理4大常用API函数
获取进程描述符,且描述符的。+1,表示进程多一个用户。原创 2024-06-27 21:44:18 · 467 阅读 · 0 评论 -
Linux源码阅读笔记09-进程NICE案例分析1
函数功能:获取某个进程的nice值,其中nice值为进程的优先级,与静态优先级有关(nice=static_prio-120)。原创 2024-07-02 23:16:42 · 314 阅读 · 0 评论 -
Linux源码阅读笔记10-进程NICE案例分析2
静态优先级,直接通过 set_user_nice()函数更改进程的静态优先级。(nice的取值范围:-20 ~ 19)函数功能:设置某进程的 NICE 值,其 NICE 值的计算是根据进程的。原创 2024-07-02 23:20:24 · 259 阅读 · 0 评论 -
Linux源码阅读笔记12-RCU案例分析
在中我们已经了解了RCU机制的原理和Linux的内核源码,这里我们要根据RCU机制写一个demo来展示他应该如何使用。原创 2024-07-03 22:22:58 · 642 阅读 · 0 评论 -
云端AI大模型&群体智慧后台架构思考
在自然语言生成领域,通过为模型提供适当的提示词,可以控制生成文本的风格、内容和结构,从而满足不同场景下的需求。然而,它也有其局限性,比如需要大量的标注数据,标注过程可能耗时且昂贵,以及模型可能受到训练数据中噪声和偏差的影响等。这通常是通过向模型喂入大量的无标注数据进行无监督训练来实现的,使模型涌现出更好的基础能力,以在不同任务上都获得较好效果。提示词工程是一种强大的工具,用于引导大型语言模型产生高质量的文本输出,允许用户更好地利用这些模型的能力,并为各种应用程序提供了广泛的可能性。原创 2024-07-06 23:06:54 · 1712 阅读 · 0 评论 -
基于C++11的线程池
C++线程池,基于stdc++11实现,附完整代码和使用过程原创 2024-04-14 21:41:35 · 429 阅读 · 0 评论 -
gRPC知识归档
RPC是远程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起远程调用。RPC凭借强大的治理功能,成为解决分布式系统问题的一大利器。gRPC是一个现代的,高性能的,开源的和语言无关的通用RPC框架,HTTP2协议设计,序列化使用PB(Protocol Buffer)高性能序列化框架,基于HTTP2+PB保证高性能。tars兼容grpcbrpc也兼容grpcgrpc不兼容tars和brpc。原创 2024-03-01 00:37:37 · 1182 阅读 · 0 评论 -
用户态协议栈01-udp收发
dpdk的用户态udp协议栈原创 2024-02-26 16:01:16 · 1150 阅读 · 0 评论 -
异步日志方案——spdlog
spdlog是一款开源的C++日志库,他有着极高的性能和几乎零成本的抽象。spdlog支持异步和同步日志记录,提供了多种日志级别,可以将日志打印在终端,文件或者自定义接收器(如数据库)。原创 2024-02-04 15:08:00 · 2821 阅读 · 0 评论 -
dpdk03-概念补充
dpdk概念补充原创 2023-11-24 18:16:06 · 785 阅读 · 0 评论 -
dpdk00-前期准备
dpdk前期准备原创 2023-11-24 15:23:22 · 122 阅读 · 0 评论 -
dpdk02-环境设置
dpdk环境准备原创 2023-11-24 15:08:03 · 231 阅读 · 0 评论 -
dpdk01-安装
dpdk的安装,详细步骤。原创 2023-11-24 14:35:13 · 120 阅读 · 0 评论 -
百万并发连接的实践测试02
本次主要解决上次遗留的数据结构问题。原创 2023-11-19 20:02:11 · 95 阅读 · 0 评论 -
上下文跳转之ucontext
ucontext跳转同样适合用于协程,比起setjmp。它的使用更加简单,但是跨平台能力欠缺,比如在windows上就无法执行。原创 2023-11-17 21:41:12 · 257 阅读 · 0 评论 -
setjmp和longjmp
在C语言的库中,setjmp.h可能很多人都没用过,甚至不知道。今天也是刚好接触到,来记录一下他的作用。原创 2023-11-17 01:14:19 · 114 阅读 · 0 评论 -
套接字非阻塞设置
记录一下套接字的非阻塞设置。原创 2023-11-12 20:09:46 · 131 阅读 · 1 评论 -
百万并发连接的实践测试01
主要是记录一下使用前面学的epoll+reactor的多路IO复用的网络编程技巧做一个百万并发连接的测试。这篇文章主要是实现,没用使用复杂的数据结构。第二篇会使用一些数据结构优化。原创 2023-11-11 16:59:32 · 120 阅读 · 1 评论