自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 c++元编程tookit类

下面记录几个,在c++元编程中常用的工具类。

2024-09-16 15:04:04 239

原创 模板编程中二义性问题

菱形继承是 一个常见的二义性问题,这个问题在模板元编程中也很容易隐晦的存在。

2024-07-26 19:00:34 297

原创 c++模板之typename的使用

如果某个模板类的传入类型参数是确定的,则不必加typename修饰类型如果模板类传入类型是模糊的,则需要加typename修饰类型,因为可能某个偏特化版本中是static变量。

2024-07-23 20:32:59 322

原创 agentsim流程分析

这里是类斯坦福小镇项目的一个调研。主要目的是寻找行为树模式的氛围npc不够智能的解决方案。下面会先简单介绍下一些关键的类,然后再讲解流程。该项目有段时间没维护了,没法直接运行,有兴趣的可以修修,主要是openai接口版本的问题。

2024-06-18 17:49:00 1080

原创 c++20协程详解(四)

到这就是协程的最后一节了。希望能帮到大家。

2024-04-07 15:39:34 1044

原创 c++20协程详解(三)

前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程,于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识,主要包括(模板偏特化,模板参数列表传值,模板函数类型推断)可以提前了解下,方便后续理解。

2024-04-03 14:06:51 1321

原创 c++协程详解(二)

这是c++协程实现第二篇,这里开始我们将开始真正意义上开始实现协程。对协程基础流程不清楚的,可以看我的第一篇。后续可能需要一定的模板知识,可以看下我的模板的文章,那些知识就完全够用了。本篇将实现一个协程封装的异步任务队列,即一个耗时任务到其他线程完成后,继续恢复执行流。在这里你可以看到如何通过协程去回调。下面就直接开始吧。

2024-04-01 22:17:53 974

原创 c++20协程详解(一)

c++协程执行基础流程,c++协程定义,c++协程概念

2024-03-31 21:38:27 1742

原创 docker基础使用

该文章是个人学习docker的一个记录,挑选使用比较科学的指令,在这做个记录,同时方便初步接触docker的同学,能够快速且完整的掌握docker的基本使用。看完本文你可以掌握的知识点为:(1)使用dockerfile构建镜像 (2)按照交互式启动容器 (3)容器 端口和文件映射 (4)以较为科学的方式创建删除镜像和容器 (5)镜像迁移。

2023-12-04 21:24:12 196

原创 c++20协程基础概念

c++协程

2023-03-06 22:59:40 2200 3

原创 cmake使用示例

cmake 使用示例

2022-08-19 21:11:15 490

原创 从x86-64汇编角度看c++代码

从汇编角度看c代码

2022-07-02 23:05:32 3054 1

原创 工厂模式(c++继承和泛型实现)

工厂模式继承和泛型实现

2022-06-29 18:35:29 581

原创 c++单例模式

工作中常用设计模式汇总。

2022-06-28 17:34:06 204

原创 libuv异步任务逻辑和uv_queue_work()

libuv 异步逻辑和任务队列源码分析

2022-06-21 23:25:57 1763

原创 uv_run流程

libuv 事件循环逻辑

2022-06-20 22:36:01 891

原创 uv_loop_init()流程

libuv的初步学习笔记

2022-06-17 16:20:08 782

原创 c++模板学习笔记

前言因为之前看boost源码在模板上遇到了比较大的问题,所以前段时间抽空读了《c++templates》,而且网上缺少成体系的博客,所以在这里和大家分享下。这算是一个系统性的学习笔记,希望帮助到大家。多态和泛型谈到模板大家一定听说过泛型编程或者元编程。那么我们一定会思考什么是泛型,它和多态的区别是什么?首先多态和泛型都目的都是为了实现多型,只是两种实现的方式不一样。多态的实现我们在c++中是通过基类指针指向子类对象来实现的,通过virtual关键字将函数推断推迟到运行时,在运行时,通过查找虚函数

2022-05-21 15:33:03 705

原创 汇编常用知识

前言该文章写作目的:帮助自己以及有一定汇编基础的同学,尽快回想起汇编相关知识。如果不想本地生成代码,推荐在线编译器compiler expolorer。下文所有就是基于x86-64架构,gcc 11.2编译器介绍。compiler explorer很好用,左边是代码输入,可以选择很多语言,右边可以选择编译器以及填入编译选项。还可以生成可执行文件,直接在页面查看运行结果,以及编译后的真实内存地址。不同色块可以帮助我们定位单条语句生成的汇编代码。常用寄存器寄存器%rax 用于函数返回值传参%rd

2022-05-15 16:23:17 3881 4

原创 boost.asio 源码剖析

前言自工作以来一直想看boost库底层代码,但每次都被一大堆宏以及各种模板劝退了,这段时间不怎么忙,咬着牙看完了boost.asio的事件调度。学习过程中发现有关这部分文章比较少,所以再次分享下,希望能帮助到大家,如有问题欢迎评论。我的boost版本为1.7.5boost版本可以通过引入boost/version.hpp,然后点进去查看boostboost不同于libevent或者muduo ,使用的为前摄器模式。前摄器和reactor模式很类似,区别在于,reactor是当socket可

2022-04-24 21:45:00 3728 2

原创 TCP/IP详解

前言本将会尽可能详细地介绍TCP/IP的机制,而不会执着于分析协议帧结构。同时会拓展部分其他协议帮助更好理解tcp/ip协议。如有问题,欢迎讨论。知识铺垫网络结构分层谈到网络,雷打不动的分层结构图。比较常用的为4层架构,和5层架构。网络结构层也叫mac层对应数据链路层和物理层。协议设计原则为:下层看不见上层的内容,仅将上层协议包作为payload直接包装成下层的数据包。但难免会有特例,如:iarp就违反了分层原则,arp(网络层和数据链路层之间)需要知道ip层的ip。协议帧封装的过程,就是不断加消

2022-03-07 23:28:30 19670

原创 dns解析详细过程

前言学习计算机网络,我们一定要知道全称是什么,能够帮助理解记忆。下面可能不会细致到每个名字都做解释,但会尽可能地帮助大家理解dns的全过程。DNS概述dns全称Domain Name Server,是通过tcp和udp实现的一个服务。目的是实现域名和ip的转换。访问dns是通过一个称为resolver的应用程序库完成的。域名域名的作用是将字符串和ip关联起来,方便人记忆。谈到域名,大家应该总是能看到 “树状结构“。下面举个例子:简单介绍下上面这张图。root为根服务器,它和存储了gtld

2022-02-23 01:28:13 3829

原创 网络消息转发流程

前言计算机网络这部分内容非常重要,尤其是在调试网络程序时,以及优化网络层代码时。然而很多程序员都对网络不够了解,甚至有些人戏谑这部分内容为八股文,浮躁的社会,我们需要沉下心来。学习计算机网络的难点是每一层内容都很多,很容易一头钻入细节中,而无法归纳出整体框架。在查阅学习中,我发现互联网上大多数文章都是对协议进行深入分析,几乎没有人做串连工作,导致我们似乎看懂了某个协议,或者某一层,但对整个网络还是没有一个系统的了解,因此我写作的目的是帮助大家对网络有个较为系统的认识。书籍推荐《tcp/ip详解卷一》,看

2022-02-17 00:35:03 4661

原创 muduo库网络部分

网络相关的文件简述TcpServer.* : tcp server,用于处理客户端连接,管理客户端连接Acceptor.* : 接受客户端连接EventThreadLoop.* : 线程池,每个线程中有一个eventloop做事件循环InetAddress.* : 包装struct sockaddr_in , 方便对struct sockaddr_in的使用socketsOps.* : 对网络相关系统api封装,简化使用socket.* : 封装socketfd,方便对sock

2022-02-02 15:10:35 571

原创 muduo事件处理

我个人觉得muduo库最重要的,最值得学的部分就是事件循环eventloop。我也会尽可能详细的讲解。eventloop采用reactor模式,相比boost的前摄器模式,代码相对更容易看懂,但大量回调的使用,会导致初学者比较难找到一个完整逻辑,从而增大对代码理解的难度。事件循环部分核心部分由Poller,Channel,Eventloop组成。EventThread和EventThreadPool,是基于EventLoop的扩展。Poller,channel都是针对io任务(定时任务,socket,普

2022-01-20 23:30:45 532

原创 【muduo/base】线程

#前言muduo库也封装了线程Thread类,线程池ThreadPool。以及线程辅助类ThreadData,在这一部分我们可以学到如何创建线程,如何回收线程,加深对进程和线程的理解,以及代码规范方面的提升。Thread类头文件代码(去除了和命名相关的成员变量和函数)class Thread : noncopyable{ public: typedef std::function<void ()> ThreadFunc; explicit Thread(ThreadFunc

2022-01-16 21:24:12 359

原创 【muduo/base】线程同步类

前言muduo库也对线程同步原语封装了一下,为下面三个类:(1) MutexLock (2)Condition (3) CountDownLatch我将简化类,或以伪代码的形式作为讲解mutex类简化后的代码class MutexLock : noncopyable{ public: MutexLock() { //pthread_mutex_init 系统调用 初始化一个锁 MCHECK(pthread_mutex_init(&mutex_, NULL));

2022-01-13 00:20:25 194 2

原创 【muduo/base】对象拷贝控制

nocopyable 类nocopyable功能:让该类的派生类对象无法拷贝class noncopyable{ public: noncopyable(const noncopyable&) = delete; void operator=(const noncopyable&) = delete; protected: noncopyable() = default; ~noncopyable() = default;};分析如何禁止对象的拷贝在c

2022-01-12 22:02:32 164

原创 muduo学习简单介绍

该栏的目的是做记录,方便自己后续查阅,同时帮助一些想要了解muduo库却没有头绪的同学。个人不会做特别详细的系统api用法的介绍,因为这一块网上已经有很多博主在做了,而且做的足够好。

2022-01-11 23:24:22 1851

原创 golang方法使用建议

golang方法golang也是可以实现面向对象编程。方法定义:方法是一种和对象绑定的特殊函数。它具有普通函数的所有特性(之前文章已介绍),比较特殊的是它有一个接收器(receiver),用于作为函数操作的对象。方法定义receiver的选择方法reciever可以用类型也可以用指针。两者的区别仅仅在于调用方法时是否需要拷贝对象,这实际上和通过形式参数传参没有本质区别,由此可见如果方法需要修改对象的值,那么需要指针作为receiver。【注】reciever无论是变量还是指针,都拥有所有的方

2021-11-23 23:42:05 238

原创 golang函数详解

golang函数golang函数特点汇总无需前置声明函数调用,不需要在调用函数先之前声明被调函数不支持函数重载同一个包中函数名不能重复不支持默认参数(这是一种优秀的代码习惯,c++中也不提倡使用默认参数)支持不定长变参不定长(使用…), 变参 (使用interface{})支持多返回值支持匿名函数和闭包(下文会专门解释)函数传参和大多数语言一样,golang可以按值传参,以及按引用(指针)传值。这两者本质并区别,从实参到形参都需要经历一次拷贝,只是拷贝的对象不一样。前者拷贝

2021-11-18 00:12:28 1728

原创 map使用注意事项及底层原理

mapmap 为一个hash table的引用不能对map中的值取地址map的index需要可比较,如果想用无法比较的值作为key,可以把key序列化为字符串map可以在迭代的过程中删除元素,迭代器不会失效golang中没有set,可以用map实现set功能,用key存放 set中的值,val中存放bool类型形如map[int]boolfor range 遍历map使用注意点链接...

2021-11-15 20:45:02 381

原创 slice注意事项

sliceslice本身并不是动态数组和数组指针,而已一个结构,通过设置内部指针和其他属性来访问一部分数据slice底层结构type slice struct{array unsafe.Pointerlen intcap int}array为指针,指向底层数组len 内部元素个数cap 容量数量关系为 0 <= len <= capslice创建方式array := []int{1, 2, 3, 4, 5, 6, 7}slice := array[lo

2021-11-14 21:23:22 353

原创 golang结构体

golang 结构体预备知识golang将数据类型分为4种,依次是基础数据类型,复合数据类型,引用数据类型, 接口数据类型1)基础数据类型:数字,字符串, 布尔2)复合数据类型: 数组,结构体3)引用数据类型:指针,切片,字典,函数,通道4)接口数据类型几个特殊结构底层结构1)string {*dataptr, len}2)slice {*dataptr,len,capacity}3)map {*hashtableptr}4)interface{} {*

2021-11-13 17:17:40 449

原创 golang 类型别名

类型别名(type)在c/c++中类型别名 我们常用 #define(编译预处理时简单的字符串替换) 和typedef(编译期间做替换)。在golang中我们使用type,从使用方面和c/c++中还是有比较大区别的测试代码package mainimport ( "fmt" "reflect")type X inttype Y intfunc testFunc(param X) { fmt.Printf("%T\n", param)}func testFunc2(param

2021-11-13 15:08:03 1257

原创 golang变量

变量必要概念在计算机中,变量为一段内存。变量类型决定了变量的存储方式,以及存储长度,我们无法改变类型,但我们可以通过强制类型转换,可以用不同的方式读取或修改变量的值,但这并不意味着我们改变了变量类型。实际上,内存分配发生在运行时。有点汇编基础的,就应该知道,汇编层面,没有变量这一概念,只有对内存数组的操作而已常用变量定义的方式var x = 100var x intx := 100(规范)推荐分组定义变量var ( x int y int u,v = 100)定义变量的

2021-11-13 13:59:15 273

空空如也

空空如也

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

TA关注的人

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