<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[weixin_40468982的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weixin_40468982</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_40468982]]></copyright><item><title><![CDATA[C++ 线程池]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316691</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316691</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 01:07:25 +0800</pubDate><description><![CDATA[线程池（Thread Pool）是一种预先创建并维护若干线程的并发编程模型，所有任务提交后由池内线程处理，避免频繁创建销毁线程带来的系统开销。资源复用：复用固定数量的线程处理大量短时任务控制并发：防止线程数无控制增长导致内存耗尽或CPU调度崩溃任务排队：合理调度和管理任务执行顺序。]]></description><category></category></item><item><title><![CDATA[C++ 链接过程中如何使用符号表]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316683</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316683</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 01:04:46 +0800</pubDate><description><![CDATA[符号表是编译器和链接器用于记录和查找程序中各种符号信息的数据结构。一个符号可能表示变量、函数、全局数据、常量、段等内容。符号名类型（如函数、变量、段等）存储类别（本地、全局、弱符号等）符号的地址或偏移量所属段（如.text.data.bss定义或引用状态在使用 ELF 格式的系统（如 Linux）中，每个目标文件通常会包含一个.symtab段，保存该目标文件中所有符号的详细信息。程序编译后会生成一个或多个目标文件（Object Files）。这些目标文件可能包含对其他文件中符号的引用。]]></description><category></category></item><item><title><![CDATA[C++ 编译期与运行期详解]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316607</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316607</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:47:05 +0800</pubDate><description><![CDATA[2、词法分析 : 将源代码分解成一个个独立的词法单元 （tokens），如关键字 （int， class）、标识符 （myVariable）、操作符 （+，=）、字面量 （123， "hello"） 等。7、链接 ：（严格来说，链接可以看作编译过程的最后一步或一个独立阶段） 将多个编译单元生成的对象文件 （.o 或 .obj） 以及所需的库文件链接在一起，解析外部引用，最终生成一个单一的可执行文件。9、输出： 程序的运行结果、对文件的修改、屏幕上的输出、网络发送的数据等。]]></description><category></category></item><item><title><![CDATA[void*通常怎么使用？]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316588</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316588</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:44:31 +0800</pubDate><description><![CDATA[它是一种特殊的指针类型，可以指向任何数据类型的对象（或函数）的地址，但它本身不包含任何关于它所指向对象类型的信息。如果想创建可以存储任何类型数据的列表、树、哈希表等，或者编写可以处理任何类型数组的排序、搜索算法（如标准库的 qsort），void* 是常用的方法。这是 void* 的主要缺点。像 qsort 这样的函数接受一个 void* 指向数组基地址，并需要一个比较函数，该比较函数也接受两个 const void* 参数，你需要在比较函数内部将 void* 转换回实际的数据类型指针进行比较。]]></description><category></category></item><item><title><![CDATA[c++中cpu-绑核]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316568</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316568</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:40:20 +0800</pubDate><description><![CDATA[在C++程序中进行CPU核心绑定（也称为CPU亲和性设置），指的是将程序的线程或进程绑定到特定的CPU核心上运行。这种做法可以带来一系列的好处，是实现提高cpu缓冲命中率，减少上下文切换开销重要解决方案。这是 Linux 系统上最常用的绑核方法。二、使用 taskset命令行工具(linux)在启动程序时通过taskset绑定核心。三、特别说明。]]></description><category></category></item><item><title><![CDATA[c++ 模板函数对性能优化]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316545</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316545</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:37:32 +0800</pubDate><description><![CDATA[中，如果T是基本数据类型，编译器可能会完全展开这个函数，直接在调用处插入相应的机器指令，避免了函数调用的开销。当使用模板实现泛型算法时（例如标准库中的std::sort、std::find等），编译器可以根据具体的类型进行优化。由于模板通常被设计为内联函数（虽然这不是强制性的），这为编译器提供了更多的机会来执行内联优化，从而消除函数调用开销，并允许进一步的优化如常量折叠、死代码消除等。对于一个整数数组和浮点数数组，使用同一个排序算法模板，编译器会为每种类型生成专门的代码，可能利用该类型的特性进行优化。]]></description><category></category></item><item><title><![CDATA[C++中的CRTP]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316495</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316495</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:32:16 +0800</pubDate><description><![CDATA[自定义类继承自模板类std::enable_shared_from_this，便可以在自定义类中使用模板类中的shared_from_this() 方法。注意需要自定义本身调用了shared_ptr的构造函数后，方可调用shared_from_this() 方法。回归CRTP，自定义类需要将自身作为模板参数传递给 std::enable_shared_from_this，在派生类中才可以使用 std::enable_shared_from_this 提供的 shared_from_this() 方法。]]></description><category></category></item><item><title><![CDATA[构造函数中调用虚函数的错误]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316471</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316471</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:28:46 +0800</pubDate><description><![CDATA[这种设计虽然稍显“繁琐”，但可以清晰地把构造逻辑和初始化逻辑分离，避免在半初始化状态下调用子类代码。如果你在虚函数中调用外部接口、注册回调、访问依赖类状态，很可能由于对象未完全构造而。尤其是团队开发中，别人看到你调用了虚函数，很可能在子类中做了你意想不到的事情。时，虚函数分发机制根据当前的“构造阶段”判断调用哪个版本，而此时只认。表面上看，它只是调用了“错误的版本”，但在真实项目中，后果可能非常严重。，即便你“知道”自己调用的是某个子类的方法，也不要这么做。，对象通过内部的虚函数表指针来动态分发函数调用。]]></description><category></category></item><item><title><![CDATA[std::string转换成std::wstring]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316354</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147316354</guid><author>weixin_40468982</author><pubDate>Fri, 18 Apr 2025 00:23:57 +0800</pubDate><description><![CDATA[的大小因平台而异：在Windows上通常为2字节（UTF-16编码），在Linux上多为4字节（UTF-32编码）。转换过程涉及UTF-8的变长编码规则：1字节表示ASCII字符，2-4字节表示其他Unicode字符。是一个转换facet，负责将UTF-8的多字节序列解码为宽字符。它支持UTF-8到宽字符的转换，代码简洁且安全。使用标准化的UTF-8解码算法，跨平台一致性好，性能稳定。采用的编码，2字节表示大部分字符，4字节表示增补平面字符。可变长编码，1字节表示ASCII，中文字符通常为3字节。]]></description><category></category></item><item><title><![CDATA[磁盘I/O性能分析]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/147288616</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/147288616</guid><author>weixin_40468982</author><pubDate>Wed, 16 Apr 2025 22:54:40 +0800</pubDate><description><![CDATA[await 值的大小一般取决与 svctm 的值和 I/O 队列长度以 及I/O 请求模式，如果svctm的值与await很接近，表示几乎没有I/O等待，磁盘性能很好，如果await的值远高于svctm的值，则表示I/O队列等待太长，系统上运行的应用程序将变慢，此时可以通过更换更快的硬盘或者升级CPU来解决问题。如果 %util 接近 100% ，表示磁盘产生的 I/O 请求太多，I/O 系统已经满负荷的在工作，该磁盘可能存在瓶颈。名称显示，“1”代表每隔1s采取一次数值，“2”代表总共采取2次数值。]]></description><category></category></item><item><title><![CDATA[磁盘 I/O原理刨析]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/146115168</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/146115168</guid><author>weixin_40468982</author><pubDate>Sat, 08 Mar 2025 13:44:38 +0800</pubDate><description><![CDATA[计算机的运行，就像一场有条不紊的交响乐演奏，CPU、内存、磁盘等硬件各司其职，共同奏响和谐的旋律。在这场演奏中，磁盘 I/O 虽然不像 CPU 那样被众人熟知，却承担着至关重要的角色。它就像一座桥梁，连接着计算机的内部世界与外部存储，负责数据的输入与输出。从打开一份文档，到加载一款大型游戏，再到服务器处理海量数据，每一个操作都离不开磁盘 I/O 的默默支持。然而，你是否想过，为什么有时候打开一个文件会瞬间完成，而有时候却要等待许久？为什么同样是存储设备，固态硬盘和机械硬盘的读写速度会有天壤之别？]]></description><category></category></item><item><title><![CDATA[x86汇编语言]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/145582110</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/145582110</guid><author>weixin_40468982</author><pubDate>Tue, 11 Feb 2025 23:43:04 +0800</pubDate><description><![CDATA[CX 字符串和循环计数器。AX 累加器结果数据。BX 数据段数据指针。]]></description><category></category></item><item><title><![CDATA[音频的各项指标]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/130798133</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/130798133</guid><author>weixin_40468982</author><pubDate>Sun, 21 May 2023 22:47:39 +0800</pubDate><description><![CDATA[音频的各项指标]]></description><category></category></item><item><title><![CDATA[FFmpeg学习：FFmpeg4数据结构分析]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/130793495</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/130793495</guid><author>weixin_40468982</author><pubDate>Sun, 21 May 2023 16:43:05 +0800</pubDate><description><![CDATA[AVIOContext，URLProtocol，URLContext主要存储视音频使用的协议的类型以及状态。在这个结构体中，除了一些回调函数接口之外，有一个变量const char *name，该变量存储了协议的名称。下列代码显示了获取元数据并存入meta字符串变量的过程，注意每一条key和value之间有一个"\t:"，value之后有一个"\r\n"注意，这个结构体并不在FFMPEG提供的头文件中，而是在FFMPEG的源代码中。URLContext：每种协议，有一个协议操作对象和一个关联的协议对象。]]></description><category></category></item><item><title><![CDATA[C++实现二进制码流和字符串码流互转]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/115922576</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/115922576</guid><author>weixin_40468982</author><pubDate>Wed, 21 Apr 2021 00:21:41 +0800</pubDate><description><![CDATA[废话不多说上代码


#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;

void SecToStr(const std::string strSrc, std::string&amp; strDst)
{
    for (size_t j = 0; j &lt; strSrc.size(); j = j+8)
    {
        std::string strTmp = strSrc.substr(]]></description><category></category></item><item><title><![CDATA[实现set]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/115879162</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/115879162</guid><author>weixin_40468982</author><pubDate>Tue, 20 Apr 2021 00:49:34 +0800</pubDate><description><![CDATA[package set

import (
	"bytes"
	"fmt"
)

func main() {

}

type HashSet struct {
	m map[interface{}]bool
}

func NewHashSet() *HashSet {
	return &amp;HashSet{m: make(map[interface{}]bool)}
}

//添加    true 添加成功 false 添加失败
func (set *HashSet) Add(e interfac.]]></description><category></category></item><item><title><![CDATA[context包的用途]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/115879068</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/115879068</guid><author>weixin_40468982</author><pubDate>Tue, 20 Apr 2021 00:47:24 +0800</pubDate><description><![CDATA[context包的用途Context通常被译作上下文，它是一个比较抽象的概念，其本质，是【上下上下】存在上下层的传递，上会把内容传递给下。在Go语言中，程序单元也就指的是Goroutine
]]></description><category></category></item><item><title><![CDATA[make和new区别]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/115879017</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/115879017</guid><author>weixin_40468982</author><pubDate>Tue, 20 Apr 2021 00:46:19 +0800</pubDate><description><![CDATA[new
1.new的作用是初始化一个指向类型的指针(*T)
2.new函数式内建函数，函数定义：func new(Type) *Type
3.使用new函数来分配空间，传递给new函数的时一个类型，不是一个值。返回值，指向这个新分配的零值的指针


make的作用是为slice，map或chan初始化并返回引用(T)
make函数式内建函数，函数定义:func make(Type, size IntegerType) Type
第一个参数是一个类型，第二个参数是长度，返回值是一个类型
make(T,args]]></description><category></category></item><item><title><![CDATA[select可以用于什么，常用语gorotine的完美退出]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/115878965</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/115878965</guid><author>weixin_40468982</author><pubDate>Tue, 20 Apr 2021 00:44:46 +0800</pubDate><description><![CDATA[golang 的 select 就是监听 IO 操作，当 IO 操作发生时，触发相应的动作每个case语句里必须是一个IO操作，确切的说，应该是一个面向channel的IO操作
]]></description><category></category></item><item><title><![CDATA[go struct能不能比较]]></title><link>https://blog.youkuaiyun.com/weixin_40468982/article/details/115878915</link><guid>https://blog.youkuaiyun.com/weixin_40468982/article/details/115878915</guid><author>weixin_40468982</author><pubDate>Tue, 20 Apr 2021 00:43:24 +0800</pubDate><description><![CDATA[因为是强类型语言，所以不同类型的结构不能作比较，但是同一类型的实例值是可以比较的，实例不可以比较，因为是指针类型
]]></description><category></category></item></channel></rss>