<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[W2155的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/W2155</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; W2155]]></copyright><item><title><![CDATA[MySQL:InnoDB存储引擎（存储结构篇）]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/148594521</link><guid>https://blog.youkuaiyun.com/W2155/article/details/148594521</guid><author>W2155</author><pubDate>Thu, 12 Jun 2025 09:35:02 +0800</pubDate><description><![CDATA[在创建表的时候，因为不知道数据的量级，为了节省空间只会创建7个零散页放到碎片区中，随着数据量的增大，会在碎片区不断创建新的页，当页的数量达到32个的时候，后续每次申请都会申请一个完整的区空间。区是用来管理页的数据结构，区的大小是1MB可以管理64个页，如果跨页读取，那么页大概率是相近的，可以减少磁头的摆动，如果一个页被频繁的访问，那么整个区都会读取到内存当中，减少IO次数。不同的页在磁盘的位置不一定是连续的，一旦跨页访问会涉及到磁盘的随机访问，磁盘是通过摆动磁头来进行随机访问，机械运动效率低。]]></description><category></category></item><item><title><![CDATA[MySQL:InnoDB架构(内存架构篇)]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/148566226</link><guid>https://blog.youkuaiyun.com/W2155/article/details/148566226</guid><author>W2155</author><pubDate>Tue, 10 Jun 2025 20:38:06 +0800</pubDate><description><![CDATA[数据库的主要作用就是持久化数据，如果每次查询都要进行一次磁盘IO，效率会非常低下，因为磁盘IO是机械运动，所以mysql会将，表数据和索引数据缓存到内存中，如果查询的数据被缓存在内存中，直接在内存中操作，省去了磁盘IO大大提高了效率。如果使用DML修改的数据，是与二级索引关联的，并且没有缓存在BufferPool，ChangeBuffer会将修改给缓存起来，直到相关二级索的页，因查询被加载到bufferPool中，在将修改合并。减少磁盘的IO，避免了对二级索引的修改，频繁的进行磁盘的IO。]]></description><category></category></item><item><title><![CDATA[条款14：在资源管理类中小心拷贝行为]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147337924</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147337924</guid><author>W2155</author><pubDate>Fri, 18 Apr 2025 18:00:51 +0800</pubDate><description><![CDATA[像shared_ptr，每次拷贝的时候引用技术+1，析构的时候-1，引用计数为0时删除对象。如果你是一个资源管理类的作者，那么一定会面对一个问题，RAII在被赋值的时候会发生什么？就像lock_gurad，管理锁的一个类，他的拷贝构造是被禁止的。涉及到智能指针，那拷贝的资源一定需要进行深拷贝。移动所有权之后ptr变为nullptr。有四种解决方案供你选择。像unique_ptr。4.转移资源的所有权。]]></description><category></category></item><item><title><![CDATA[条款13：以对象管理资源]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147336264</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147336264</guid><author>W2155</author><pubDate>Fri, 18 Apr 2025 17:42:36 +0800</pubDate><description><![CDATA[当然现在auto_ptr已经被淘汰了，C++11之后 unique_ptr完全代替了auto_ptr，unique_ptr 不仅支持指向数组，还支持自定义删除器都是auto_ptr不具备的，而且 c++17之后auto_ptr被完全删除。如果你的delete语句在循环中，遇到goto 和 break之后你的pI还能不能被释放?没错但是内存只是我们需要管理众多资源的一种，资源还包括数据的连接，文件描述符，互斥锁，网络套接字，不管哪种资源他都是从系统中获取的，当你不在需要他的时候是要还给系统的。]]></description><category></category></item><item><title><![CDATA[条款12：复制对象时勿忘其每一个一个成分]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147335332</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147335332</guid><author>W2155</author><pubDate>Fri, 18 Apr 2025 16:45:06 +0800</pubDate><description><![CDATA[如果你声明自己的拷贝函数，再你增加成员变量的时候，不要忘记修改拷贝函数，因为即使你忘记再你的拷贝函数中添加新的成员变量，编译器并不会报错，在vs2022中会存在警告。一个好的面向对象系统会将内部封装起来，只留两个函数负责拷贝，在必要的时候编译器会自动为我们生成拷贝函数，这些编译默认生成的拷贝函数的行为就是将类的成员全部拷贝一份。这个拷贝函数看着没啥问题，实则问题大了，那我问你 你的基类成分去哪了？你的基类成分难道不需要拷贝吗？如果忘记在拷贝构造中添加date 会出现一个警告，但是拷贝赋值不会出现警告。]]></description><category></category></item><item><title><![CDATA[条款11：再operator=处理自我赋值]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147319463</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147319463</guid><author>W2155</author><pubDate>Fri, 18 Apr 2025 09:25:50 +0800</pubDate><description><![CDATA[可能客户并不会这么愚蠢写出这样的代码，但是有一些自我赋值不是那么容易发现的。但是这并不是最优的做法，增加一个控制流会减缓一些指令的执行速度。看这段代码如果是自我赋值就惨了， 先把自己给删除了。利用传值拷贝构造一个新的对象，再交换成员变量。可以添加一个证同测试。]]></description><category></category></item><item><title><![CDATA[条款10：令operator=返回一个reference to *this]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147319254</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147319254</guid><author>W2155</author><pubDate>Fri, 18 Apr 2025 08:56:34 +0800</pubDate><description><![CDATA[这个只是一个协定，如果你没有更好的理由，还是要遵守这个协定，像内置类型看齐。这么做是为了支持，像内置类型那样进行连锁赋值。]]></description><category></category></item><item><title><![CDATA[条款09：不要再构造函数和析构函数中调用虚函数]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147318693</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147318693</guid><author>W2155</author><pubDate>Fri, 18 Apr 2025 08:48:51 +0800</pubDate><description><![CDATA[在构造和析构函数中调用虚函数，本身就是一个错误的行为，这样调用不会带来你想要的结果。]]></description><category></category></item><item><title><![CDATA[条款08：别让异常逃离析构函数]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147312787</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147312787</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 20:23:39 +0800</pubDate><description><![CDATA[C++并不禁止析构函数抛出异常，但是不鼓励你去这么做在doSomething执行完毕，v会销毁调用 widget的析构函数，如果析构函数出现异常，假设v有10个 widget对象，那么就会连抛10个异常，上个异常可能还没处理完，再抛异常程序会调用std::terminate()直接终止程序。如果你的析构函数需要执行一个动作，但是这个动作可能抛出异常怎么办？]]></description><category></category></item><item><title><![CDATA[条款07：为多态基类声明一个virtual析构函数]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147312182</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147312182</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 19:45:30 +0800</pubDate><description><![CDATA[就出现大问题了，当delete一个对象时，会调用其析构函数，但是ptk指向的是一个派生类对象，delete ptk;只会调用 ~Timekeeper()，而派生类部分仍然存在，这个时候就会出现一个，销毁了一半的怪物。virtual不是胡乱加的，如果一个类成员是 两个整形的变量，那么这个类的大小是64bit，如果你添加了一个虚函数，在类空间的起始位置会添加一个虚表指针，如果是32位的机器类的大小是96bit，如果是64位机器类的大小来到了128bit。客户使用你的代码时，只想使用时间，不关系是如何计时的。]]></description><category></category></item><item><title><![CDATA[条款06：若不想使用编译器自动生成的函数，就该明确拒绝]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147310402</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147310402</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 17:40:32 +0800</pubDate><description><![CDATA[protect:private:编译自动生成的拷贝构造，会去先调用基类的拷贝构造，但是基类拷贝构造在派生类是无法访问的，这样编译器就无法默认生成了。]]></description><category></category></item><item><title><![CDATA[条款05：了解C++默默编写并调用哪些函数]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147309645</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147309645</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 17:15:22 +0800</pubDate><description><![CDATA[当成员函数有引用 或者 被const修饰，编译器是不会自动生成 operator= 的，因为 &必须在定义的时候初始化，而且初始化之后不可以进行修改，const也同样，这个时候需要程序员手动写operator=。operator=被声明为私有，派生类生成的默认operator=回去先调用基类类的operator=，但是没有权限，编译器也无能为力。如果程序员不去写这些函数 ，他们会在被调用的时候由编译器生成。这些默认生成的函数都是public和inline。]]></description><category></category></item><item><title><![CDATA[条款04：确定对象被使用之前已经被初始化]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147306077</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147306077</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 15:30:45 +0800</pubDate><description><![CDATA[一定要使用构造函数初始化列表，而不是在构造函数的函数体内赋值。private:// 不要这样private:成员初始化的顺序，就是类内声明的顺序。当一个成员变量初始化，需要用到另一个成员变量，要保证初始化的次序。例：array数组初始需要大小，在array初始化之前 保证表示大小的那个成员已经初始化完毕。]]></description><category></category></item><item><title><![CDATA[条款03：尽可能多使用const]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147300624</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147300624</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 14:28:06 +0800</pubDate><description><![CDATA[非const类型的指针 对应 iterator, const 类型的指针对应 const_iterator.当然这种做法需要借助 mutable关键字来释放，非静态成员变量的位常量性，是其支持逻辑常量性。这种说法主张，在const成员函数中某些变量是可以被修改的，但这些修改一定是不可见。const 放在 * 号的左边是修饰指向的内容， 放在* 右边是修饰指针本身。注意：如果成员变量中含有指针，那么这个这个指针指向的内容是可被修改的。这种说法主张的是const成员函数的任何一个比特位都是不可以修改。]]></description><category></category></item><item><title><![CDATA[条款02:尽量以const，enum，inline代替#define]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/147296702</link><guid>https://blog.youkuaiyun.com/W2155/article/details/147296702</guid><author>W2155</author><pubDate>Thu, 17 Apr 2025 11:44:03 +0800</pubDate><description><![CDATA[定义const指针时，别忘了指针指向的内容也是不可更改的，所以要在*号的后面加个const。private:首先#define不提供任何的封装所以无法作为类的专属变量。在定义 static const int NumTurns = 5;时如果你的编译不支持在类内进行初始化，可以使用匿名枚举（enum hack）或者 类内定义类外初始化。]]></description><category></category></item><item><title><![CDATA[git:5步搞定向远程仓库提交]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/145943084</link><guid>https://blog.youkuaiyun.com/W2155/article/details/145943084</guid><author>W2155</author><pubDate>Sat, 01 Mar 2025 19:37:26 +0800</pubDate><description><![CDATA[【代码】git:5步搞定向远程仓库提交。]]></description><category></category></item><item><title><![CDATA[git:分支控制]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/145942505</link><guid>https://blog.youkuaiyun.com/W2155/article/details/145942505</guid><author>W2155</author><pubDate>Sat, 01 Mar 2025 09:27:27 +0800</pubDate><description><![CDATA[master主分支：主分支，master分支上的代码通常是部署在生产环境中的，通常是稳定的代码，不会再主分支上进行任何的开发操作，写出个bug那服务就直接挂了就惨了。通常进行开发的时候通常会创建一个分支，在分支上开发，对分支修改不会影响主分支，如果代码没问题，再将分支合并到主分支。]]></description><category></category></item><item><title><![CDATA[https:原理]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/145859149</link><guid>https://blog.youkuaiyun.com/W2155/article/details/145859149</guid><author>W2155</author><pubDate>Tue, 25 Feb 2025 19:50:51 +0800</pubDate><description><![CDATA[中间人攻击最主要的就是没有办法去甄别客户端收到的公钥是否是被篡改过了，解决了这个问题，自然就解决了中间人攻击。https引入了CA证书解决去解决这个问题，CA证书是需要去CA认证的机构去申请的。申请的时候需要提供公司的信息，网站的域名，申请人，最重要的服务器的公钥。CA证书主要构成，一段明文数据 + 签名（对数据指纹进行加密）。签名：就是对这段明文数据描述的数据指纹进行了加密。加密是用的是CA机构的私钥加密。]]></description><category></category></item><item><title><![CDATA[QT:Button ]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/145601972</link><guid>https://blog.youkuaiyun.com/W2155/article/details/145601972</guid><author>W2155</author><pubDate>Thu, 13 Feb 2025 13:28:52 +0800</pubDate><description><![CDATA[QPushButton类继承于QAbstractButton类，需要先了解QAbstractButton有那些成员属性。QPushButton继承于QWidget类。QPushButton派生了一下这些类。QAbstractButton有以下属性。]]></description><category></category></item><item><title><![CDATA[websocketpp库使用：快速搭建一个websocket服务端]]></title><link>https://blog.youkuaiyun.com/W2155/article/details/145579439</link><guid>https://blog.youkuaiyun.com/W2155/article/details/145579439</guid><author>W2155</author><pubDate>Wed, 12 Feb 2025 11:17:12 +0800</pubDate><description><![CDATA[在需要实时更新数据的场景下，如在线聊天、实时股票行情显示等，客户端为了获取最新信息，不得不频繁地向服务器发送请求，这种方式会造成大量不必要的网络流量和服务器负载，同时也无法保证数据的实时性。常见的操作码包括 0x0（延续帧）、0x1（文本帧）、0x2（二进制帧）、0x8（关闭帧）、0x9（Ping 帧）和 0xA（Pong 帧）。服务器收到客户端的升级请求后，如果同意升级，会返回一个状态码为 101 的响应，并包含相应的报头信息。客户端发送的帧必须进行掩码处理，服务器发送的帧不能进行掩码处理。]]></description><category></category></item></channel></rss>