<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[想让你搞懂的博客]]></title><description><![CDATA[实实切切]]></description><link>https://blog.youkuaiyun.com/m0_59337025</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_59337025]]></copyright><item><title><![CDATA[C++编译器如何消除重复代码]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/157327198</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/157327198</guid><author>m0_59337025</author><pubDate>Sat, 24 Jan 2026 15:07:04 +0800</pubDate><description><![CDATA[模板：当一个编译单元中实例化模板之后，它并不知道其他单元同样也实例化了。所以当同一个模板在不同的编译单元中被实例化的时候必然会产生大量的重复代码。例如：模板、外部内联函数、虚函数表、默认构造函数、默认拷贝构造、默认操作符赋值都有可能在不同的编译单元内生成很多大量重复的代码。默认构造函数、拷贝构造函数、赋值运算符等，如果在多个编译单元中被调用，也会被生成多次。这里的重复代码是指C++编译器在很多时候会生成很多重复代码。虚函数表：当一个类在某一个编译单元中被使用之后，就会生成该类的虚函数表。]]></description><category></category></item><item><title><![CDATA[Token：从编译器到大模型的七十年旅程]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/156147612</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/156147612</guid><author>m0_59337025</author><pubDate>Mon, 22 Dec 2025 13:44:43 +0800</pubDate><description><![CDATA[本文探讨了Token概念在编译器和人工智能领域的演变历程。从1950年代编译器中的语法分析单元，到现代大语言模型处理自然语言的基本单位，Token始终承担着将原始输入转化为机器可处理语义单元的核心功能。文章对比了两者在出现时间、所属领域、定义、切分方法等方面的差异，同时指出它们在基本概念和抽象化目标上的相似性。虽然实现方式不同（编译器基于规则，AI模型基于统计），但都体现了将混沌输入转化为结构化机器符号的哲学思想。这一概念跨越七十年，从形式语言延伸至自然语言处理，展现了技术思想的传承与创新。]]></description><category></category></item><item><title><![CDATA[魔数的作用]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/148256273</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/148256273</guid><author>m0_59337025</author><pubDate>Thu, 19 Jun 2025 19:22:38 +0800</pubDate><description><![CDATA[魔数是在编程中直接使用的未解释常量值，可能导致代码难以理解。它分为三类：贬义性魔数（如260限制FTP路径，雷神之锤中的0x5f3759df用于平方根倒数计算），中性魔数（如文件头标识PNG、PDF等格式），以及褒义性魔数（用于数据结构验证、类型检查、调试等）。合理使用魔数可以提高代码效率和可维护性，但需注意添加注释以避免混淆。]]></description><category></category></item><item><title><![CDATA[接口继承和实现继承]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/148313033</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/148313033</guid><author>m0_59337025</author><pubDate>Tue, 03 Jun 2025 10:53:59 +0800</pubDate><description><![CDATA[接口继承和实现继承是面向对象编程中两种不同的继承方式。接口继承仅定义行为规范（纯虚函数），子类必须实现所有抽象方法，用于多态和API设计，耦合性低。实现继承则复用父类的具体实现，子类可选择性重写虚函数，主要用于代码复用，但耦合性较高。典型例子：接口继承通过纯抽象类强制子类实现方法（如IShape），实现继承通过普通类允许子类继承默认行为（如Animal）。前者强调"能做什么"，后者侧重"如何复用"。
]]></description><category></category></item><item><title><![CDATA[C++面试：HTTP1.0/1.1，HTTP2.0，HTPP3.0的区别]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/129813481</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/129813481</guid><author>m0_59337025</author><pubDate>Fri, 13 Dec 2024 13:48:21 +0800</pubDate><description><![CDATA[其次TCP是系统内核实现的，如果升级TCP协议，就得让用户升级系统，这个的门槛比较高，而QUIC在UDP基础上由客户端自由发挥，只要有服务器能对接就可以。⑤还是会有由TCP导致的队头阻塞，同一个Stream的数据，在HTTP2.0中可以乱序发送，再由Streamid信息组装，但是如果其中一个片段丢失，就会导致后续的HTTP请求阻塞住，因为滑动窗口不会移动直到再次将丢失数据快重传。④服务器会主动推送消息不再是被动。①头部压缩，利用HPAK算法，维护一张表，将字段放入表中，返回索引，不用重复发送相同的字段。]]></description><category></category></item><item><title><![CDATA[初识Protobuf与Protobuf的安装]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/134414850</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/134414850</guid><author>m0_59337025</author><pubDate>Tue, 05 Dec 2023 20:06:32 +0800</pubDate><description><![CDATA[Protocol Buffers 是 Google 的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法，它可⽤ 于（数据）通信协议、数据存储等。]]></description><category></category></item><item><title><![CDATA[如何理解MySQL隔离性---3个记录隐藏字段、undo日志、Read View]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/132187872</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/132187872</guid><author>m0_59337025</author><pubDate>Thu, 10 Aug 2023 17:10:59 +0800</pubDate><description><![CDATA[Read View就是事务进行 快照读 操作的时候生产的 读视图 (Read View)，在该事务执行的快照读的那一 刻，会生成数据库系统当前的一个快照，记录并维护系统当前活跃事务的ID(当每个事务开启时，都会被分配一个ID, 这个ID是递增的，所以最新的事务，ID值越大)但如果是快照读，读取历史版本的话，是不受加锁限制的。该事务执行的快照读的那一 刻，会生成数据库系统当前的一个快照，记录并维护系统当前活跃事务的ID，其中最小的id放在up_limit_id中，最大的id放在low_limit_id中。]]></description><category></category></item><item><title><![CDATA[MySQL事务]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/132098484</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/132098484</guid><author>m0_59337025</author><pubDate>Wed, 09 Aug 2023 14:32:06 +0800</pubDate><description><![CDATA[事务就是一组DML语句组成，这些语句在逻辑上存在相关性，这一组DML语句要么全部成功，要么全部 失败，是一个整体。这句话是不是很熟悉，这不就是原子性吗，一个操作要么做完要么不做，不存在做了一部分的情况。上面的概念可以理解为：一个SQL语句或者多个SQL语句的集合，就是集合。原子性：一个事务（transaction）中的所有操作，要么全部完成，要么全部不完成，不会结束在中 间某个环节。事务在执行过程中发生错误，会被回滚（Rollback）到事务开始前的状态，就像这个 事务从来没有执行过一样。]]></description><category></category></item><item><title><![CDATA[MySQL索引特性]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/131062366</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/131062366</guid><author>m0_59337025</author><pubDate>Fri, 04 Aug 2023 10:01:53 +0800</pubDate><description><![CDATA[可是，貌似这样也有效率问 题，在Page之间，也是需要 MySQL 遍历的，遍历意味着依旧需要进行大量的IO，将下一个Page加载到 内存，进行线性检测。当我们强制的展示所有的数据时，mysql会被操作系统kill掉，因为mysql检索数据需要将文件中的数据加载到内存中，当操作系统检测到mysql占用太多内存资源，就会将mysql这个进程终止。1.二叉搜索树，深度过深，意味着内存中要加载的数据就会很多，所以系统和硬盘的IO的次数增多，并且有可能退化成线性结构，效率更低。]]></description><category></category></item><item><title><![CDATA[MySQL表的增删改查]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/130733870</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/130733870</guid><author>m0_59337025</author><pubDate>Sun, 04 Jun 2023 17:34:53 +0800</pubDate><description><![CDATA[所以这样的语句可以执行,order by语句是最后执行的,前面的语句已经执行过english+math+chinese as total,所以这里的total就是english+math+chinese。我想显示ename但是我没有group by后跟ename，这样是错的。排序，基本是在select的最后才做的，尽管他的sql语句写在比较靠后的位置。当不指明插入哪一列时，默认是全列插入，所以value必须一一对应，不能省略。一般的场景中用到的最多的是insert与repalce。]]></description><category></category></item><item><title><![CDATA[MySQL表的约束]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/130565892</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/130565892</guid><author>m0_59337025</author><pubDate>Tue, 16 May 2023 20:31:19 +0800</pubDate><description><![CDATA[当定义外键后，要求外键列数据必须在主表的主键列存在或为null。案例:如果将班级表中的数据都设计在每个学生表的后面，那就会出现数据冗余，所以我们只要设计成让stu->class_id和myclass->id形成关联的关系=>外键约束.对上面的示意图进行设计：先创建主键表和从表：我们可以看见约束的体现。主表myclass中没有213班级，从表这时要插入213班级的同学，MySQL就会阻止插入。]]></description><category></category></item><item><title><![CDATA[MySQL的数据类型]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/130514824</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/130514824</guid><author>m0_59337025</author><pubDate>Sat, 06 May 2023 21:02:51 +0800</pubDate><description><![CDATA[当我们的表的编码是utf8时，varchar(n)的参数n最大值65532/3=21844[因为utf中，一个字符占用3个字节]，如果编码是gbk，varchar(n)的参数n最大是65532/2=32766（因为gbk中，一个字符占用2字节）。而且出于效率 考虑，这些值实际存储的是“数字”，因为这些选项的每个选项值依次对应如下数字：1,2,4,8,16,32，.... 最多64个。如果M被忽略，默认为1。char(L): 固定长度字符串，L是可以存储的长度，单位为字符，最大长度值可以为255。]]></description><category></category></item><item><title><![CDATA[MySQL表的操作]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/130510246</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/130510246</guid><author>m0_59337025</author><pubDate>Fri, 05 May 2023 20:28:28 +0800</pubDate><description><![CDATA[如果该列的数据类型的大小是20字节，想改成10字节，那数据怎么截取，这都是问题，所以我们在建表的时候就要考虑周全。在项目实际开发中，经常修改某个表的结构，比如字段名字，字段大小，字段类型，表的字符集类型， 表的存储引擎等等。collate 校验规则，如果没有指定校验规则，则以所在数据库的校验规则为准。突然，因为我们增加了个新用户，名字比较长，我们需要修改下name的数据类型。文件系统中当前的数据库的目录之下，会有刚创建的表的相应的文件。这样看是改好了，但是查看建表细节，就会发现name没有了注释。]]></description><category></category></item><item><title><![CDATA[MySQL库的操作]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/130489009</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/130489009</guid><author>m0_59337025</author><pubDate>Fri, 05 May 2023 16:27:37 +0800</pubDate><description><![CDATA[MySql对大小写不敏感实际上我们应该打大写，库的名字加上``，我们使用的场景是一般在该名字与MySql中的关键字起冲突的情况下。至于修改数据库的名字在Mysql中是被禁止的，这是有他自己的考量。我们知道这些数据库都是以目录形式存在于我们的文件系统中，通常数据库的数据默认存储在/var/lib/mysql中。我们建立一个默认的database，在该数据库的目录下的dp.opt文件中，我们看到该数据库的字符集和检验规则。对数据库的修改主要指的是修改数据库的字符集，校验规则。]]></description><category></category></item><item><title><![CDATA[I/O多路转接——epoll服务器代码编写]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/130079502</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/130079502</guid><author>m0_59337025</author><pubDate>Mon, 01 May 2023 23:56:54 +0800</pubDate><description><![CDATA[在LT模式中，当我们想写时只需要将对应的文件描述符所对应的EPOLLOUT添加事件中，在我们今天的编写代码中，在whlie循环中的事件检测中，当检测到是EPOLLOUT事件时，我们就可以在回调函数中调用send函数。我们的代码耦合度太高了，数据处理的函数放在了源文件中，我们另起一个头文件，将处理函数放到该头文件中，这样业务处理是业务处理，网络服务是网络服务。]]></description><category></category></item><item><title><![CDATA[I/O多路转接——select服务器代码编写]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/129861032</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/129861032</guid><author>m0_59337025</author><pubDate>Thu, 06 Apr 2023 17:35:23 +0800</pubDate><description><![CDATA[以读的文件描述符集合为例，用户传入0111 0111，表示要关注0、1、2、4、5、6这几个描述符对应的读事件，系统返回0110 0000，表示当前5、6对应的读事件就绪。我们当前只是对listensock进行select，进行等待，select成功只是说明listensock对应的读事件就绪表示有连接到来，而accept上来的文件描述符对应的读事件不代表就就绪了，还需要将这个文件描述符放入select中。我们的处理方式，不止要处理listensock，还要处理其他的文件描述符对应的事件。]]></description><category></category></item><item><title><![CDATA[通俗理解五种IO模型---五个钓鱼佬的故事]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/129838741</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/129838741</guid><author>m0_59337025</author><pubDate>Wed, 29 Mar 2023 17:20:04 +0800</pubDate><description><![CDATA[在异步IO模型中，进程只需要告诉OS它要读取数据就立即返回，当数据就绪之后，OS会自动的将数据从内核空间拷贝到用户空间。]]></description><category></category></item><item><title><![CDATA[数据链路层——以太网、ARP]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/129711187</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/129711187</guid><author>m0_59337025</author><pubDate>Sat, 25 Mar 2023 16:41:54 +0800</pubDate><description><![CDATA[当ARP协议层获得报文时，说明得到了MAC帧层的筛选，有可能为ARP请求目的地址为全F，可能为ARP应答目的地址和当前主机对应上了，所以这是就要看OP选项，去查看是应答还是请求，是应答就获取想知道的目的IP地址；是请求的话，提取目的IP地址查看是否与当前主机的IP地址相同，如果相同，构建应答将本主机MAC地址填入，并发送。而不具有明确MAC地址时，此时目的地址填的是全F，表示广播， 在此局域网中的主机都要受到，传到不是目的主机的主机时，会继续提取目的IP地址，来判断是否是目的主机，不是在丢弃。]]></description><category></category></item><item><title><![CDATA[网络层——IP协议]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/129583783</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/129583783</guid><author>m0_59337025</author><pubDate>Mon, 20 Mar 2023 21:20:53 +0800</pubDate><description><![CDATA[应用层协议具有读取完整报文&序列化&协议处理的能力。

    传输层协议解决的是可靠性问题。报文完整到达，如何不给网络造成过大的压力等更多的是策略。

    而网络层协议解决如何将数据从A主机发送到B主机的能力。

    传输层协议加网络层协议 —— >TCP/IP协议可靠的将数据从A主机发送到B主机。]]></description><category></category></item><item><title><![CDATA[TCP、UDP协议---协议端格式、三次握手四次挥手等传输层协议的策略]]></title><link>https://blog.youkuaiyun.com/m0_59337025/article/details/129347311</link><guid>https://blog.youkuaiyun.com/m0_59337025/article/details/129347311</guid><author>m0_59337025</author><pubDate>Thu, 16 Mar 2023 12:19:39 +0800</pubDate><description><![CDATA[为什么不是两次挥手？你向我发FIN，我接收，再发送ACK+FIN，这样只用两次挥手。如果使用两次挥手，客户端只要发送FIN，服务端就只能回复FIN。当客户端发来FIN，服务端不想断开连接，因为还要业务没有完成，无法用其他的方法拒绝FIN。一般情况下，客户端发送FIN，到服务端发送FIN，会有一段时间间隔来使服务端完成它的任务。]]></description><category></category></item></channel></rss>