<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[c++小白的博客]]></title><description><![CDATA[纯属个人娱乐]]></description><link>https://blog.csdn.net/qq_40571533</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; qq_40571533]]></copyright><item><title><![CDATA[协程6 --- HOOK]]></title><link>https://blog.csdn.net/qq_40571533/article/details/143590131</link><guid>https://blog.csdn.net/qq_40571533/article/details/143590131</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:05:13 +0800</pubDate><description><![CDATA[修改符号指向我们可以通过HOOK系统的socket函数族来实现无需修改代码的异步化改造。]]></description><category></category></item><item><title><![CDATA[协程5 --- 栈切换]]></title><link>https://blog.csdn.net/qq_40571533/article/details/143571380</link><guid>https://blog.csdn.net/qq_40571533/article/details/143571380</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:04:42 +0800</pubDate><description><![CDATA[数组名 得到的是数组指针，数组指针的步长为整个数组的长度。看实现之前可以先看一下另一个博客特殊的栈溢出例子。用堆模拟栈的时候，堆栈的生长方向是相反的。为什么要设置成只有一个长度的数组？sizeof(数组名) 为数组长度。作为函数参数退化为指针。]]></description><category></category></item><item><title><![CDATA[协程4 --- 一个特殊的栈溢出例子]]></title><link>https://blog.csdn.net/qq_40571533/article/details/126973920</link><guid>https://blog.csdn.net/qq_40571533/article/details/126973920</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:04:11 +0800</pubDate><description><![CDATA[函数的地址复制到后面8个字符（编译成64位程序，指针大小为8Byte）。数组比temp数组长的后8位也被拷贝过去了，由于关闭了栈保护，把原来的。分析之前先普及一下几点知识。这边注意一下栈是往下生长的。有个长度位24的字符数组。，前面16个字符初始化。数组变量，结果字符串。]]></description><category></category></item><item><title><![CDATA[协程3 --- golang的协程调度]]></title><link>https://blog.csdn.net/qq_40571533/article/details/143580775</link><guid>https://blog.csdn.net/qq_40571533/article/details/143580775</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:03:43 +0800</pubDate><description><![CDATA[M在绑定有效的P后，进入一个调度循环，而调度循环的机制大致是从P的本地运行队列以及全局队列中获取G，切换到G的执行栈上并执行G的函数，调用goexit 做清理工作并回到M，如此反复。P的数量决定了系统内最大可并行的G的数量，P的数量受本机的CPU核数影响，可通过环境变量$GOMAXPROCS或在runtime.GOMAXPROCS()来设置，默认为CPU核心数。描述：1个用户线程对应1个内核线程，最容易实现，能够利用多核，一个线程被阻塞，不会阻塞其他线程，协程的调度都由操作系统完成。]]></description><category></category></item><item><title><![CDATA[协程2 --- 相关概念]]></title><link>https://blog.csdn.net/qq_40571533/article/details/126974738</link><guid>https://blog.csdn.net/qq_40571533/article/details/126974738</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:03:07 +0800</pubDate><description><![CDATA[有栈协程是真的给你开了一个栈（如golang），主流的无栈协程方案（例如C++，Rust等），是把一个协程函数编译成状态机的逻辑，然后用一块临时分配的堆内存去保存这个函数里的变量和协程状态机以及上下文等内容。GCC支持一种允许栈内存不连续的编译参数，实现原理是在每个函数调用开头都插入一段栈内存检测的代码，如果栈内存不够用了就申请一块新的内存，作为栈内存的延续。，所以依然存在几个边边角角的难点需要开发者注意：没有gc，TLS的问题，用户不按套路出牌、把逻辑代码run在协程之外，粗粒度的线程锁等等。]]></description><category></category></item><item><title><![CDATA[协程1 --- 发展历史]]></title><link>https://blog.csdn.net/qq_40571533/article/details/143124608</link><guid>https://blog.csdn.net/qq_40571533/article/details/143124608</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:02:28 +0800</pubDate><description><![CDATA[对要完成的任务进行分解，先对最高层次中的问题进行定义、设计、编程和测试，而将其中未解决的问题作为一个子任务放到下一层次中去解决。普通人大概率不能并行，却可以并发，你先左手画一笔，然后右手画一笔，同一时候只有一只手在操作，来回交替，直到完成两个图案，这就是并发，协程主要的功能。抢占式的线程可以解决大部分的问题，也就是说协程能干的线程干得也不错，线程干的不好的地方，使用者暂时也可以接受。协程和线程并非矛盾，协程的威力在于IO的处理，恰好这部分是线程的软肋，由对立转换为。]]></description><category></category></item><item><title><![CDATA[经典网络模型]]></title><link>https://blog.csdn.net/qq_40571533/article/details/126973556</link><guid>https://blog.csdn.net/qq_40571533/article/details/126973556</guid><author>qq_40571533</author><pubDate>Thu, 07 Nov 2024 21:00:50 +0800</pubDate><description><![CDATA[定义：单线程主要针对IO操作而言，I/O中的accept()、read()、write()都是在一个线程完成的。IO操作和业务逻辑处理操作在一个线程上，大大降低了I/O请求的处理效率。无法充分利用和发挥多核 CPU 的性能。可靠性问题，线程意外终止，或者进入死循环，会导致整个系统通信模块不可用，不能接收和处理外部消息，造成节点故障。]]></description><category></category></item><item><title><![CDATA[c++11/14新特性---智能指针]]></title><link>https://blog.csdn.net/qq_40571533/article/details/143122037</link><guid>https://blog.csdn.net/qq_40571533/article/details/143122037</guid><author>qq_40571533</author><pubDate>Tue, 22 Oct 2024 10:12:54 +0800</pubDate><description><![CDATA[结果一个对象会被析构了两次，在这个例子中使用同一个指针 this 构造了两个智能指针对象 sp1 和 sp2，这二者之间是没有任何关系的，因为 sp2 并不是通过 sp1 初始化得到的实例对象。智能指针主要用于管理在堆上分配的内存，它将普通的指针封装为一个栈对象。counter对象的目地就是用来申请一个块内存来存引用基数，s是share_ptr的引用计数，w是weak_ptr的引用计数，当w为0时，删除Counter对象。进行初始化时不能将一个普通指针直接赋值给智能指针，因为一个是指针，一个是类。]]></description><category></category></item><item><title><![CDATA[c++11/14新特性---函数语法]]></title><link>https://blog.csdn.net/qq_40571533/article/details/143118570</link><guid>https://blog.csdn.net/qq_40571533/article/details/143118570</guid><author>qq_40571533</author><pubDate>Tue, 22 Oct 2024 10:12:31 +0800</pubDate><description><![CDATA[如果能够使用临时对象已经申请的资源，既能节省资源，还能节省资源申请和释放的时间，如果要执行这样的操作就需要使用右值引用了，右值引用具有移动语义，移动语义可以将资源（堆、系统对象等）通过浅拷贝从一个对象转移到另一个对象这样就能减少不必要的临时对象的创建、拷贝以及销毁，可以大幅提高 C++ 应用程序的性能。通过测试代码可以看出，在子类中初始化从基类继承的类成员，需要在子类中重新定义和基类一致的构造函数，这是非常繁琐的，C++11 中通过添加继承构造函数这个新特性完美的解决了这个问题，使得代码更加精简。]]></description><category></category></item><item><title><![CDATA[c++11/14新特性---关键字]]></title><link>https://blog.csdn.net/qq_40571533/article/details/136994959</link><guid>https://blog.csdn.net/qq_40571533/article/details/136994959</guid><author>qq_40571533</author><pubDate>Tue, 22 Oct 2024 10:11:35 +0800</pubDate><description><![CDATA[google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换，缺点无。为了实现运行时检测，编译器创建额外的代码，然而这会妨碍程序优化。用关键字using作为别名的开始，其后紧跟别名和等号，其作用是把等号左侧的名字规定成等号右侧类型的别名。常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式，是由它的数据类型和初始值共同决定的。选择并返回操作数的数据类型。在此过程中，编译器分析表达式并得到它的类型，却不实际计算表达式的值。将返回参数包中元素的数量，结果是一个编译时常量，类型为。]]></description><category></category></item><item><title><![CDATA[linux常用工具介绍]]></title><link>https://blog.csdn.net/qq_40571533/article/details/126970468</link><guid>https://blog.csdn.net/qq_40571533/article/details/126970468</guid><author>qq_40571533</author><pubDate>Fri, 14 Jul 2023 15:45:23 +0800</pubDate><description><![CDATA[linux常用命令记录]]></description><category></category></item><item><title><![CDATA[MySQL行转列的问题]]></title><link>https://blog.csdn.net/qq_40571533/article/details/128919654</link><guid>https://blog.csdn.net/qq_40571533/article/details/128919654</guid><author>qq_40571533</author><pubDate>Tue, 07 Feb 2023 18:05:24 +0800</pubDate><description><![CDATA[mysql行转列]]></description><category></category></item><item><title><![CDATA[C语言学习推荐---小游戏]]></title><link>https://blog.csdn.net/qq_40571533/article/details/108183754</link><guid>https://blog.csdn.net/qq_40571533/article/details/108183754</guid><author>qq_40571533</author><pubDate>Mon, 31 Oct 2022 20:46:02 +0800</pubDate><description><![CDATA[C语言推荐小游戏学习之路]]></description><category></category></item><item><title><![CDATA[gcc/g++链接时候库的顺序]]></title><link>https://blog.csdn.net/qq_40571533/article/details/126791905</link><guid>https://blog.csdn.net/qq_40571533/article/details/126791905</guid><author>qq_40571533</author><pubDate>Wed, 14 Sep 2022 05:03:16 +0800</pubDate><description><![CDATA[gcc]]></description><category></category></item><item><title><![CDATA[Webbench阅读]]></title><link>https://blog.csdn.net/qq_40571533/article/details/126768955</link><guid>https://blog.csdn.net/qq_40571533/article/details/126768955</guid><author>qq_40571533</author><pubDate>Thu, 08 Sep 2022 18:01:46 +0800</pubDate><description><![CDATA[Webbench工具]]></description><category></category></item><item><title><![CDATA[ubuntu jsoncpp 1.9.5 编译使用]]></title><link>https://blog.csdn.net/qq_40571533/article/details/124500173</link><guid>https://blog.csdn.net/qq_40571533/article/details/124500173</guid><author>qq_40571533</author><pubDate>Fri, 29 Apr 2022 17:56:20 +0800</pubDate><description><![CDATA[目录下载编译拷贝头文件和库文件测试代码
下载
jsoncpp 1.9.5 好像不支持scons编译了，使用cmake编译
原始仓库： https://github.com/open-source-parsers/jsoncpp
gitee仓库：https://gitee.com/mirrors/jsoncpp/tree/master
选择版本下载

编译
搞到linux上解压执行cmake CMakeLists.txt，发现了编译攻略：

按照上面的操作：
创建目录：


注：这边cp的文件是重新解压缩的，]]></description><category></category></item><item><title><![CDATA[MyTinySTL阅读笔记---概述]]></title><link>https://blog.csdn.net/qq_40571533/article/details/102558371</link><guid>https://blog.csdn.net/qq_40571533/article/details/102558371</guid><author>qq_40571533</author><pubDate>Mon, 08 Nov 2021 15:56:43 +0800</pubDate><description><![CDATA[文章目录简介分配器c++中的new和deletenew operatoroperator newplacement new实际测试deleteSTL分配器一级配置器二级配置器一级二级配置器统一的接口内存池实现MyTinySTL分配器allocatorconstructdestroy内存池实现allocatedeallocatereallocate迭代器概述类型traits萃取指针行为反向迭代器 r...]]></description><category></category></item><item><title><![CDATA[MyTinySTL阅读笔记---容器]]></title><link>https://blog.csdn.net/qq_40571533/article/details/120991658</link><guid>https://blog.csdn.net/qq_40571533/article/details/120991658</guid><author>qq_40571533</author><pubDate>Mon, 08 Nov 2021 15:54:29 +0800</pubDate><description><![CDATA[容器
概述
分类：

序列容器

关联容器


序列式容器
vector
动态增长数组
关联式容器

]]></description><category></category></item><item><title><![CDATA[MyTinySTL阅读笔记---算法]]></title><link>https://blog.csdn.net/qq_40571533/article/details/120992334</link><guid>https://blog.csdn.net/qq_40571533/article/details/120992334</guid><author>qq_40571533</author><pubDate>Fri, 29 Oct 2021 17:03:40 +0800</pubDate><description><![CDATA[算法

]]></description><category></category></item><item><title><![CDATA[MyTinySTL阅读笔记---仿函数和配接器]]></title><link>https://blog.csdn.net/qq_40571533/article/details/120991322</link><guid>https://blog.csdn.net/qq_40571533/article/details/120991322</guid><author>qq_40571533</author><pubDate>Fri, 29 Oct 2021 17:02:57 +0800</pubDate><description><![CDATA[仿函数
所谓仿函数也就是函数对象, 以前是这样称呼它的, 只是一直沿用至今了。仿函数就是一种具有函数特质的对象.。
可以将部分操作由用户自己来定义然后传入自定义的函数名就可以被调用。
根据参数个数分类
一元仿函数
一元仿函数基类：
template &lt;class Arg, class Result&gt;
struct unary_function {
    typedef Arg argument_type;	// 参数类型别名
    typedef Result result_type;	//]]></description><category></category></item></channel></rss>