自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

c++小白的博客

纯属个人娱乐

  • 博客(87)
  • 收藏
  • 关注

原创 协程6 --- HOOK

修改符号指向我们可以通过HOOK系统的socket函数族来实现无需修改代码的异步化改造。

2024-11-07 21:05:13 907

原创 协程5 --- 栈切换

数组名 得到的是数组指针,数组指针的步长为整个数组的长度。看实现之前可以先看一下另一个博客特殊的栈溢出例子。用堆模拟栈的时候,堆栈的生长方向是相反的。为什么要设置成只有一个长度的数组?sizeof(数组名) 为数组长度。作为函数参数退化为指针。

2024-11-07 21:04:42 366

原创 协程4 --- 一个特殊的栈溢出例子

函数的地址复制到后面8个字符(编译成64位程序,指针大小为8Byte)。数组比temp数组长的后8位也被拷贝过去了,由于关闭了栈保护,把原来的。分析之前先普及一下几点知识。这边注意一下栈是往下生长的。有个长度位24的字符数组。,前面16个字符初始化。数组变量,结果字符串。

2024-11-07 21:04:11 348

原创 协程3 --- golang的协程调度

M在绑定有效的P后,进入一个调度循环,而调度循环的机制大致是从P的本地运行队列以及全局队列中获取G,切换到G的执行栈上并执行G的函数,调用goexit 做清理工作并回到M,如此反复。P的数量决定了系统内最大可并行的G的数量,P的数量受本机的CPU核数影响,可通过环境变量$GOMAXPROCS或在runtime.GOMAXPROCS()来设置,默认为CPU核心数。描述:1个用户线程对应1个内核线程,最容易实现,能够利用多核,一个线程被阻塞,不会阻塞其他线程,协程的调度都由操作系统完成。

2024-11-07 21:03:43 763

原创 协程2 --- 相关概念

有栈协程是真的给你开了一个栈(如golang),主流的无栈协程方案(例如C++,Rust等),是把一个协程函数编译成状态机的逻辑,然后用一块临时分配的堆内存去保存这个函数里的变量和协程状态机以及上下文等内容。GCC支持一种允许栈内存不连续的编译参数,实现原理是在每个函数调用开头都插入一段栈内存检测的代码,如果栈内存不够用了就申请一块新的内存,作为栈内存的延续。,所以依然存在几个边边角角的难点需要开发者注意:没有gc,TLS的问题,用户不按套路出牌、把逻辑代码run在协程之外,粗粒度的线程锁等等。

2024-11-07 21:03:07 685

原创 协程1 --- 发展历史

对要完成的任务进行分解,先对最高层次中的问题进行定义、设计、编程和测试,而将其中未解决的问题作为一个子任务放到下一层次中去解决。普通人大概率不能并行,却可以并发,你先左手画一笔,然后右手画一笔,同一时候只有一只手在操作,来回交替,直到完成两个图案,这就是并发,协程主要的功能。抢占式的线程可以解决大部分的问题,也就是说协程能干的线程干得也不错,线程干的不好的地方,使用者暂时也可以接受。协程和线程并非矛盾,协程的威力在于IO的处理,恰好这部分是线程的软肋,由对立转换为。

2024-11-07 21:02:28 1086

原创 经典网络模型

定义:单线程主要针对IO操作而言,I/O中的accept()、read()、write()都是在一个线程完成的。IO操作和业务逻辑处理操作在一个线程上,大大降低了I/O请求的处理效率。无法充分利用和发挥多核 CPU 的性能。可靠性问题,线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。

2024-11-07 21:00:50 923

原创 c++11/14新特性---智能指针

结果一个对象会被析构了两次,在这个例子中使用同一个指针 this 构造了两个智能指针对象 sp1 和 sp2,这二者之间是没有任何关系的,因为 sp2 并不是通过 sp1 初始化得到的实例对象。智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。counter对象的目地就是用来申请一个块内存来存引用基数,s是share_ptr的引用计数,w是weak_ptr的引用计数,当w为0时,删除Counter对象。进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。

2024-10-22 10:12:54 941

原创 c++11/14新特性---函数语法

如果能够使用临时对象已经申请的资源,既能节省资源,还能节省资源申请和释放的时间,如果要执行这样的操作就需要使用右值引用了,右值引用具有移动语义,移动语义可以将资源(堆、系统对象等)通过浅拷贝从一个对象转移到另一个对象这样就能减少不必要的临时对象的创建、拷贝以及销毁,可以大幅提高 C++ 应用程序的性能。通过测试代码可以看出,在子类中初始化从基类继承的类成员,需要在子类中重新定义和基类一致的构造函数,这是非常繁琐的,C++11 中通过添加继承构造函数这个新特性完美的解决了这个问题,使得代码更加精简。

2024-10-22 10:12:31 1057

原创 c++11/14新特性---关键字

google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。为了实现运行时检测,编译器创建额外的代码,然而这会妨碍程序优化。用关键字using作为别名的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式,是由它的数据类型和初始值共同决定的。选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。将返回参数包中元素的数量,结果是一个编译时常量,类型为。

2024-10-22 10:11:35 956

原创 linux常用工具介绍

linux常用命令记录

2023-07-14 15:45:23 1683 3

原创 MySQL行转列的问题

mysql行转列

2023-02-07 18:05:24 531

原创 C语言学习推荐---小游戏

C语言推荐小游戏学习之路

2022-10-31 20:46:02 7461

原创 gcc/g++链接时候库的顺序

gcc

2022-09-14 05:03:16 1191

原创 Webbench阅读

Webbench工具

2022-09-08 18:01:46 239

原创 ubuntu jsoncpp 1.9.5 编译使用

目录下载编译拷贝头文件和库文件测试代码下载jsoncpp 1.9.5 好像不支持scons编译了,使用cmake编译原始仓库: https://github.com/open-source-parsers/jsoncppgitee仓库:https://gitee.com/mirrors/jsoncpp/tree/master选择版本下载编译搞到linux上解压执行cmake CMakeLists.txt,发现了编译攻略:按照上面的操作:创建目录:注:这边cp的文件是重新解压缩的,

2022-04-29 17:56:20 1300 7

原创 MyTinySTL阅读笔记---概述

文章目录简介分配器c++中的new和deletenew operatoroperator newplacement new实际测试deleteSTL分配器一级配置器二级配置器一级二级配置器统一的接口内存池实现MyTinySTL分配器allocatorconstructdestroy内存池实现allocatedeallocatereallocate迭代器概述类型traits萃取指针行为反向迭代器 r...

2021-11-08 15:56:43 5777 1

原创 MyTinySTL阅读笔记---容器

容器概述分类:序列容器关联容器序列式容器vector动态增长数组关联式容器

2021-11-08 15:54:29 1824 2

原创 MyTinySTL阅读笔记---算法

算法

2021-10-29 17:03:40 1049

原创 MyTinySTL阅读笔记---仿函数和配接器

仿函数所谓仿函数也就是函数对象, 以前是这样称呼它的, 只是一直沿用至今了。仿函数就是一种具有函数特质的对象.。可以将部分操作由用户自己来定义然后传入自定义的函数名就可以被调用。根据参数个数分类一元仿函数一元仿函数基类:template <class Arg, class Result>struct unary_function { typedef Arg argument_type; // 参数类型别名 typedef Result result_type; //

2021-10-29 17:02:57 522 2

原创 MyTinySTL阅读笔记---迭代器

迭代器概述迭代器提供一种方法使它能够依顺序访问聚合物(容器)所含的各个元素,而又无需暴露改聚合物的内部表述方式。迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针(对operator *和operator->进行重载)。设计算法时,如果可能,尽量针对某种特定迭代器提供一个明确定义,并针对更强化的某种迭代器提供另一种定义,这样能在不同情况下提供最大效率。class与typename的区别typename和class在作为参数类型时用法一样, 没有区别typename主要用

2021-10-28 17:49:20 1860 12

原创 MyTinySTL阅读笔记---分配器

分配器c++中的new和delete1、new operatornew operator就是new操作符,平时使用的new(如int *pt = new object(...);)主要完成两个工作:分配足够的内存以便容纳所需类型的对象(operator new)调用构造函数初始化内存中的对象(placement new)2、operator newnew操作符为分配内存所调用函数的名字是operator new,就是间接性的调用了 malloc函数。源码:void* __CRTDECL

2021-10-28 17:47:51 1525 2

原创 linux c语言线程池

文章目录线程池原理线程池原理我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的

2021-10-22 17:17:09 679

原创 联机版贪吃蛇

sss

2021-10-15 01:06:39 3543 9

原创 c++11/14特性整理---汇总(线程)

auto 关键字for-each 循环右值及移动构造函数 + std::forward + std::move + stl 容器新增的 emplace_back() 方法std::thread 库、std::chrono 库智能指针系列(std::shared_ptr/std::unique_ptr/std::weak_ptr),智能指针的实现原理一定要知道,最好是自己实现过线程库 std::thread + 线程同步技术库 std::mutex/std::condition_variable/std::l

2021-07-29 10:21:05 1373

原创 win32 纸牌

实现效果具体实现牌分为三个部分,鼠标可以拿起若干牌,可以拖动,按照一定规则放置到其他位置,当所有的牌都放在上方时游戏就赢了。牌的随机排列使用random_shuffle乱序之后,把m_vtr当做索引就行了。CCardCtrl::CCardCtrl(): m_vtr(52){ 。。。 for (int i = 0; i < 52; i++) { m_vtr[i] = i; } srand((unsigned int)time(NULL)); random_shuffle(

2021-07-19 11:40:13 244

原创 Tinyhttpd源码阅读

文章目录简介tinyhttpd的职责http请求和响应报文格式请求响应运行代码代码执行流程源代码windows版简介tinyhttpd 是一个超轻量型 Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,用来学习非常不错,可以通过阅读这段代码理解一个 Http Server 的本质。tinyhttpd的职责接收客户端链接读取客户端发送的信息解析请求处理请求(可能会执行对应的脚本)返回响应http请求和响应报文格式参照菜鸟教程请求一

2021-03-03 18:23:43 566 1

原创 23种设计模式---概述

文章目录设计模式简介设计模式分类设计模式之间的关系面向对象设计原则为什么要用面向对象设计?例子重新认识面向对象设计原则开放封闭原则(OCP)Liskov替换原则(LSP)依赖倒置原则(DIP)单一职责原则(SRP)接口隔离原则(ISP)参考网站:菜鸟教程 C语言中文网设计模式简介设计模式设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

2021-02-02 17:20:46 935

原创 23种设计模式---解释器模式

解释器模式动机在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。解决方法给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。例子#include <iostream>#include <map>#include <stack&g

2021-02-02 17:19:15 177

原创 23种设计模式---访问者模式

访问者模式动机在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法) 。如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?解决方法表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。例子#include <iostream>using na

2021-02-02 17:09:23 161

原创 23种设计模式---命令模式

命令模式动机在软件构建过程中,“行为请求者"与"行为实现者"通常呈现一种"紧耦合”。但在某些场合-比如需要对行为进行"记录、撤销/重(undo/redo)、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与“行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。解决方法将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。例子#include <iostream>#

2021-02-02 16:38:12 139

原创 23种设计模式---责任链模式

责任链模式动机在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。解决方法使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。例子#include <iostream>#include <strin

2021-02-02 16:30:26 119

原创 23种设计模式---迭代器模式

迭代器模式动机在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种"透明遍历"也为 ,"同一种算法在多种集合对象上进行操作"提供了可能。使用面向对象技术将这种遍历机制抽象为"迭代器对象"为"应变化中的集合对象"提供了一种优雅的方式。...

2021-02-02 16:20:45 138

原创 23种设计模式---组合模式

组合模式动机在软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。如何将"客户代码与复杂的对象容器结构"解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象样来处理复杂的对象容器?解决方法将对象组合成树形结构以表示"部分-整体"的层次结构。使得用户对单个对象和组合对象的使用具有一致性(稳定)。例子#include <iostream>#inc

2021-02-02 16:05:08 142

原创 23种设计模式---备忘录模式

备忘录模式动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。解决方法在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。例子class Memento{ string state; // ..publ

2021-02-02 15:52:48 116

原创 23种设计模式---状态模式

状态模式动力在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会对对象的操作和状态转化之间引入紧耦合?解决方法允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。例子enum NetworkState{ Network_Open, Network_Close, Network_Connect,};

2021-02-02 15:44:50 127

原创 23种设计模式---中介者模式

中介者模式动机在软件构建过程中,经常会出现多个对象互相关联交互的情况对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可使用一个"中介对象"来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地氏御变化。解决方法用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖) ,从而使其耦合松散(管理变化) ,而且可以独立地交。例子// 抽象同事类c

2021-02-01 15:56:34 149

原创 23种设计模式---适配器模式

适配器模式动机在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种"迁移的变化" ?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?解决方法将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。例子// 目标接口(新接口)class ITarget{public: virtual void process()

2021-02-01 14:52:49 110

原创 23种设计模式---代理模式

代理模式动机在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等) ,直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复性?增加一层间接层是软件开发中常见的解决方式。解决方法为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。例子class ISubject{public: virtual void process();};class RealSubj

2021-02-01 14:40:31 132

原创 23种设计模式---外观模式

外观模式动机随着软件的开发,组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?解决方法为子系统中的一组接口提供一个一致(稳定)的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。例子用户需要了解所有类// 子系统角色class SubSystem01{public: void method

2021-02-01 14:26:39 145

空空如也

空空如也

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

TA关注的人

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