<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_49106549的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_49106549</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_49106549]]></copyright><item><title><![CDATA[【C++】完美转发]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/151403728</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/151403728</guid><author>m0_49106549</author><pubDate>Wed, 10 Sep 2025 15:01:29 +0800</pubDate><description><![CDATA[概念解释右值引用形参arg在函数内部，它是一个左值（因为它有名字）。设计原因防止意外多次移动，保证安全性。需要移动时必须显式使用std::move。完美转发在模板函数中，使用通用引用T&&和来保持参数原始的值类别（左值或右值）。完美转发指的是在函数模板中，将参数以原始的值类别（左值/右值）和类型完全不变地传递给另一个函数。它的核心目的是解决这样一个问题：你写了一个包装函数或转发函数，它需要把接收到的参数原封不动地传给另一个函数。操作使用的工具目的想要移动一个不再需要的具名对象。]]></description><category></category></item><item><title><![CDATA[【C++】std::make_shared 详解]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146347854</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146347854</guid><author>m0_49106549</author><pubDate>Tue, 18 Mar 2025 17:38:00 +0800</pubDate><description><![CDATA[用于异步任务执行。它封装一个可调用对象（函数、lambda 表达式等），并允许获取其执行结果。是 C++11 标准引入的一个函数模板，用于创建。对象，并高效地分配和管理对象的内存。但实际上，标准库的实现比这更复杂，因为它优化了。具有更好的性能和异常安全性。：C++11/14 不支持。里面是要创建的对象类型。是 C++11 引入的。]]></description><category></category></item><item><title><![CDATA[【C++多线程】C++异步线程池提交任务的写法和解释]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146345131</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146345131</guid><author>m0_49106549</author><pubDate>Tue, 18 Mar 2025 17:25:43 +0800</pubDate><description><![CDATA[基础知识点包括：右值、右值引用、完美转发、智能指针、Lambda表达式、可调用对象包装器function<void()>、绑定器bind、future、packaged_task

问题1：函数名(F&& f, Args&&… args) 这里的形参是啥意思？
在  这个函数的入参部分：
 采用了一种 完美转发（Perfect Forwarding） 机制，主要是为了高效地传递参数，并保持参数的值类别（左值/右值）属性。主要是为了 提高泛型代码的效率，并 避免不必要的拷贝。如果直接使用：
那么：使用  的 ]]></description><category></category></item><item><title><![CDATA[【C++】vector中emplace_back的用法]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146305870</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146305870</guid><author>m0_49106549</author><pubDate>Mon, 17 Mar 2025 08:09:42 +0800</pubDate><description><![CDATA[容器销毁：超出作用域或析构时。元素移除pop_backerase等操作。内存重新分配容量不足时，旧对象被移动后销毁。容器清空clear()调用时。异常：构造失败不影响已有对象，重新分配失败保持状态。]]></description><category></category></item><item><title><![CDATA[【C++】如果想要bind的返回值类型是function＜void()＞应该怎么办]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146305646</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146305646</guid><author>m0_49106549</author><pubDate>Mon, 17 Mar 2025 07:26:30 +0800</pubDate><description><![CDATA[要让std::bind的返回值类型是使用std::bind绑定原始函数及其所有参数，使其成为无参数的可调用对象。将结果赋值给。确保返回类型是void，否则需要调整函数逻辑。如果你有具体的函数或场景需要帮助实现，请告诉我，我可以进一步协助！]]></description><category></category></item><item><title><![CDATA[【C++多线程】packaged_task的入参（可调用对象）分类]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146294973</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146294973</guid><author>m0_49106549</author><pubDate>Sun, 16 Mar 2025 14:30:19 +0800</pubDate><description><![CDATA[在 C++ 中，可以接受多种下面分别介绍这些可调用对象如何与配合使用。可以封装多种可调用对象，包括普通函数、匿名函数（Lambda）、仿函数（重载operator()的类）、类对象转换为函数指针、静态成员函数和非静态成员函数。]]></description><category></category></item><item><title><![CDATA[【C++多线程】packaged_task与async区别]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146294567</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146294567</guid><author>m0_49106549</author><pubDate>Sun, 16 Mar 2025 13:49:44 +0800</pubDate><description><![CDATA[都是用于异步任务执行的工具，但它们的。在C++多线程编程中，]]></description><category></category></item><item><title><![CDATA[【C++多线程】thread]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146294375</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146294375</guid><author>m0_49106549</author><pubDate>Sun, 16 Mar 2025 13:35:00 +0800</pubDate><description><![CDATA[是C++11引入的线程库的一部分，提供了创建和管理线程的能力。它封装了操作系统的线程接口，使得在C++中更方便地进行多线程编程。：如果主线程退出而分离线程还未执行完，可能会导致未定义行为。，否则可能导致数据竞争（race condition）等问题。命名空间下，用于表示一个独立执行的线程对象。提供了多个构造函数，允许不同方式创建线程。等同步机制来解决这些问题。]]></description><category></category></item><item><title><![CDATA[【C++多线程】async]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146294169</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146294169</guid><author>m0_49106549</author><pubDate>Sun, 16 Mar 2025 13:20:36 +0800</pubDate><description><![CDATA[std::async定义在头文件<future>std::async是一个函数模板，用于启动异步任务，并返回一个对象，该对象可用于查询任务状态或获取结果。policy：决定任务的执行策略，可选：：强制异步执行，即在新线程中执行任务。：懒加载模式，即任务会在get()或wait()调用时才执行。（默认值）：由系统决定是否创建新线程。f：要调用的函数。args...：传递给f的参数。，其中T是f的返回类型。std::async是 C++ 标准库提供的异步执行方式，可用于创建并执行异步任务。]]></description><category></category></item><item><title><![CDATA[【C++多线程】C++线程池实现]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146293305</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146293305</guid><author>m0_49106549</author><pubDate>Sun, 16 Mar 2025 12:21:44 +0800</pubDate><description><![CDATA[/ 创建线程池，使用系统支持的并发线程数。// 构造函数，初始化线程池。// 模拟耗时任务的函数。// 线程池的工作线程。// 提交任务到线程池。// 等待所有任务完成。// 获取任务队列大小。// 调整线程池大小。// 获取线程池大小。]]></description><category></category></item><item><title><![CDATA[【C++重要！！！】赋值与初始化的区别]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146273510</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146273510</guid><author>m0_49106549</author><pubDate>Sat, 15 Mar 2025 06:01:33 +0800</pubDate><description><![CDATA[在C++中，区分赋值（assignment）和初始化（initialization）是一个非常重要的问题，因为它们在语义、调用时机和涉及的函数上有着本质的区别。您的提问源于对代码行为（如拷贝构造函数和赋值运算符）的观察，下面我会详细解释两者的定义、区别、代码示例，并结合您之前的  类进行说明。初始化（Initialization）：赋值（Assignment）：在代码中，区分赋值和初始化主要看对象是否已经存在以及语法上下文。

这些都是在对象声明时进行的操作，触发构造函数。
注意： 看起来像赋值，但它是拷贝]]></description><category></category></item><item><title><![CDATA[【linux网络编程】关于套接字编程中文件描述符对应的读写缓冲区]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146126192</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146126192</guid><author>m0_49106549</author><pubDate>Sun, 09 Mar 2025 01:23:57 +0800</pubDate><description><![CDATA[在C/C++的套接字编程中，文件描述符（file descriptor）对应的“write buffer”（写缓冲区）通常指的是操作系统内核为每个套接字（socket）维护的发送缓冲区（send buffer）。这个缓冲区并不是用户程序直接管理的内存区域，而是由TCP/IP协议栈在内核中分配和管理的。以下是对套接字文件描述符与写缓冲区的详细讲解，包括其工作原理、相关API以及如何操作。当你调用或时，数据并不是立刻发送到网络，而是被拷贝到内核的写缓冲区中。TCP协议栈会根据网络状况（如窗口大小、拥塞控制）逐步]]></description><category></category></item><item><title><![CDATA[【linux网络编程】套接字编程API详细介绍]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146125523</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146125523</guid><author>m0_49106549</author><pubDate>Sun, 09 Mar 2025 00:06:48 +0800</pubDate><description><![CDATA[函数功能返回值类型主要结构体socket()创建套接字int无bind()绑定地址intsockaddrlisten()开始监听int无accept()接受连接intsockaddrconnect()发起连接intsockaddrsend()发送数据ssize_t无recv()接收数据ssize_t无close()关闭套接字int无这些API是C语言网络编程的核心，配合结构体（如）使用，可以实现基本的客户端-服务器通信。需要注意网络字节序（htonsntohshtonlntohl）和错误处理（]]></description><category></category></item><item><title><![CDATA[【linux网络编程】文件描述符]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146124872</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146124872</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 23:19:40 +0800</pubDate><description><![CDATA[（包括套接字、标准输入、文件等）。（如套接字、管道、设备文件等）的。，用于标识这个套接字。]]></description><category></category></item><item><title><![CDATA[【linux网络编程】套接字socket]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146124682</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146124682</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 23:06:54 +0800</pubDate><description><![CDATA[的端点，是应用程序访问网络的接口，用于在不同计算机或同一计算机的进程之间通信。：在应用程序和网络协议之间建立连接，允许数据收发。，它允许不同计算机或同一计算机上的进程通过。]]></description><category></category></item><item><title><![CDATA[【linux网络编程】字节序]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146124467</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146124467</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 22:50:47 +0800</pubDate><description><![CDATA[所有数据在发送前都要转换为网络字节序（大端），无论是客户端还是服务器。接收数据后，需要转换回主机字节序，保证程序能够正确解析数据。使用htonl()htons()进行发送转换，ntohl()ntohs()进行接收转换，确保跨平台兼容性。]]></description><category></category></item><item><title><![CDATA[【linux网络编程】浏览网页时客户端与服务器之间数据交互的完整过程]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146123650</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146123650</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 22:00:41 +0800</pubDate><description><![CDATA[，然后按下回车，计算机（客户端）与服务器之间会进行一系列复杂的交互，最终将网页呈现出来。），然后按下回车，计算机（客户端）与服务器之间会进行一系列复杂的交互，最终将网页呈现出来。，通常会等待 2 * MSL（最大报文生存时间，通常是 30s~120s）。当网页加载完成，客户端和服务器的连接可能会被关闭（如果。，这个过程不像建立连接（三次握手）那样简单，而是需要。“我收到了你的关闭请求，但我还没准备好关闭连接。“我不再发送数据了，但我还能接收你的数据。“我收到了你的关闭请求，连接正式断开。]]></description><category></category></item><item><title><![CDATA[【linux网络编程】端口]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146123519</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146123519</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 21:49:00 +0800</pubDate><description><![CDATA[是用来标识不同进程或服务的逻辑通信端点。它类似于一座大楼的房间号，帮助操作系统和网络协议区分不同的应用程序，以便正确地传输数据。端口管理是服务器安全和网络优化的重要部分，合理使用端口可以提高系统的安全性和性能。在网络通信中，IP地址用于标识主机，而端口用于区分同一主机上的多个服务。端口号的作用是确保数据包可以正确地发送到特定的应用程序或服务。如果不想被扫描，可以关闭不必要的端口，或者使用防火墙限制访问。，以确定数据要发送到哪个应用程序。在服务器或网络设备上，可以使用。规则来控制端口访问。]]></description><category></category></item><item><title><![CDATA[【C++多线程】条件变量condition_variable(2)]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146118914</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146118914</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 17:11:22 +0800</pubDate><description><![CDATA[不会有 race condition（竞争条件）。进入等待之间，不会有其他线程插入操作，导致。），而是高效地等待信号，并正确获取。线程不会 “忙等待”（不断检查。线程还没进入等待状态。]]></description><category></category></item><item><title><![CDATA[【C++多线程】条件变量condition_variable(1)]]></title><link>https://blog.youkuaiyun.com/m0_49106549/article/details/146118872</link><guid>https://blog.youkuaiyun.com/m0_49106549/article/details/146118872</guid><author>m0_49106549</author><pubDate>Sat, 08 Mar 2025 17:00:58 +0800</pubDate><description><![CDATA[互斥量只负责保护数据的访问，不能用来通知其他线程状态的变化。让线程可以高效等待某个条件，避免忙等待带来的性能浪费。它们通常配合使用，依赖mutex来保护共享数据的状态。因此，即使有了互斥量，在需要线程同步的场景下，我们仍然需要来高效地协调线程的执行顺序。想象一个餐厅点餐的场景，我们用它来类比mutex和的作用。场景描述顾客点餐后需要等待厨师做好饭。厨师在顾客点餐之前是不会做饭的。顾客不能频繁去后厨查看饭是不是好了，否则会很麻烦。当饭做好后，厨师会通知顾客来取饭。不用，仅用mutex。]]></description><category></category></item></channel></rss>