<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ypy9323的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ypy9323</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ypy9323]]></copyright><item><title><![CDATA[C++ 新标准——Lambda]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/158663002</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/158663002</guid><author>ypy9323</author><pubDate>Wed, 04 Mar 2026 22:03:42 +0800</pubDate><description><![CDATA[话又说回来了，按引用捕获不是不能使用，而是应该在符合引用的场景下使用。C++ 标准关于纯右值的规定：A prvalue (“pure” rvalue) 是一种表达式，其中一种求值过程为：初始化一个对象，这种纯右值被称为拥有结果对象，这个结果可以是变量、临时对象。按引用默认捕获会导致空悬指针问题。这是因为当采用按引用默认捕获时，闭包内会包含局部变量、形参的引用，当闭包越过它们的生命周期时，闭包内引用就会空空悬。所以解决闭包引用悬空的方式是：采用按值捕获，这样捕获的变量会复制一份，不会出现悬空指针。]]></description><category></category></item><item><title><![CDATA[Effective Modern C++ 条款25]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/158618131</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/158618131</guid><author>ypy9323</author><pubDate>Tue, 03 Mar 2026 16:21:13 +0800</pubDate><description><![CDATA[在按值返回的函数中，如果返回的是绑定到右值引用或万能引用的对象（即通过引用访问的对象），那么在返回这个对象时，应该对其实施 std::move 或 std::forward。std::move(w) 产生 w 的右值引用，导致 return 语句返回的是一个表达式而非局部变量本身，因此不满足 RVO 的条件。针对右值引用的最后一次使用实施std::move, 针对右值引用的最后一次使用实施std::forward;std::move 为右值引用而生，std::forward 为万能引用而生。]]></description><category></category></item><item><title><![CDATA[C++ 智能指针—— shared_ptr 和 weak_ptr 的关系]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/158585548</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/158585548</guid><author>ypy9323</author><pubDate>Mon, 02 Mar 2026 22:51:11 +0800</pubDate><description><![CDATA[当 shared_ptr 析构时，控制块的 _Uses 计数减 1，当 _Uses 计数为 0 时，资源被销毁、同时控制块的 _Weaks 计数减 1，当 _Weaks 计数为 0 时，控制块被销毁。所以这就是强引用计数和弱引用计数的区别：强引用计数控制资源的声明周期、弱引用计数控制控制块的声明周期。shared_ptr 的析构函数触发控制块的强引用计数递减，当 _Uses 减为0时，释放资源并且触发控制块的弱引用计数递减，如果 _Weaks 大于 0 说明还有 weak_ptr 关联；]]></description><category></category></item><item><title><![CDATA[openvela——动态管理日志输出通道及其实现原理]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/155850022</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/155850022</guid><author>ypy9323</author><pubDate>Fri, 12 Dec 2025 20:30:00 +0800</pubDate><description><![CDATA[在中提到 vela 日志输出支持多通道日志输出，它们是在系统运行前期配置好的，所以无法将它们动态删除。但是可以控制使能、禁用某通道，达到相应通道输出、不输出日志的目的。接下来篇章将讲述”动态管理日志输出通道方法“和”动态管理日志输出通道原理“。]]></description><category></category></item><item><title><![CDATA[openVela——rpmsg log 实现原理]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/155813726</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/155813726</guid><author>ypy9323</author><pubDate>Thu, 11 Dec 2025 11:59:01 +0800</pubDate><description><![CDATA[Vela log 模块支持多通道输出，即同一日志可以分别输出到不同地方（如：uart、ram、file、rpmsg endpoint……）。只要配置了 rpmsg log 通道，就可以将日志跨核传输，整个过程是：coreA 写日志、coreA 格式化日志、coreA 使用 rpmsg 发送格式化结果、跨核传输日志、coreB 接收到对方传来的日志、coreB 将日志写入已配置的各输出通道。可以看出，写日志的一方(coreA)决定要不要跨核传输日志，日志最后在哪些地方输出由读日志的一方(coreB)决定。]]></description><category></category></item><item><title><![CDATA[Linux 内核——字符设备驱动框架详解]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/154456468</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/154456468</guid><author>ypy9323</author><pubDate>Wed, 05 Nov 2025 21:56:04 +0800</pubDate><description><![CDATA[char_dev.c 源文件中定义了一个存储 cdev 的名为 cdev_map 的表，当cdev_add() 被调用时, 函数体调用 kobj_map() 把 cdev 对象添加到其中。每打开一个文件，就在该数组中放入这个文件对应的文件对象的指针(struct file*)，并且返回数组的下标。应用层调用库函数 open() 会触发软中断，进入内核空间调用 sys_open(), 然后调用 vfs_open()，最后驱动层 drv_open() 被调用。，如下代码片段这个表本质是一个数组，其下标就是。]]></description><category></category></item><item><title><![CDATA[基于 Qemu 的内核模块开发初体验 ]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/154284354</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/154284354</guid><author>ypy9323</author><pubDate>Sun, 02 Nov 2025 14:16:06 +0800</pubDate><description><![CDATA[在介绍了基于 qemu 的内核（驱动）开发环境的搭建方法，现在基于它来开发第一个内核模块并简单介绍模块开发的基本框架。]]></description><category></category></item><item><title><![CDATA[C++新标准—— 可变参数模板实现递归继承（tuple 实现原理）]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/153792475</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/153792475</guid><author>ypy9323</author><pubDate>Thu, 23 Oct 2025 23:04:56 +0800</pubDate><description><![CDATA[C++  Variadic Templates 应用在 STL 的方方面面，可变参数的函数模板、类模板的核心工作机制是参数包的展开。C++17 之前通过递归的形式展开参数包，递归过程就是：将 N个元素的参数包分离第一个出来，将剩余的 N-1 个元素作为第2包，按照第1包过程继续分离第2包的一个元素，剩下 N-2 个元素作为第3包继续分离……这样不断重复下去，结果就是分离出最后一个且剩下一个空包，整个包就完全展开了。以上就是 tuple 的核心机制，应该讲的比较细致，如有错误欢迎指正。]]></description><category></category></item><item><title><![CDATA[Ubuntu22.04 中搭建基于 Qemu 的内核（驱动）开发环境]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/153748959</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/153748959</guid><author>ypy9323</author><pubDate>Wed, 22 Oct 2025 22:59:01 +0800</pubDate><description><![CDATA[跳转下载交叉编译工具压缩包：gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz。busybox 下载地址是 https://www.kernel.org/pub/ ，选择下载 busybox-1.32.0.tar.bz2。内核源码下载地址是 https://www.kernel.org/pub/ ，选择下载 linux-4.4.232.tar.xz。这里采用 从 Qemu 模拟的SD卡启动系统。编译过程特别耗时，建议用使用在线安装。]]></description><category></category></item><item><title><![CDATA[C++ STL——allocator]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/153722412</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/153722412</guid><author>ypy9323</author><pubDate>Wed, 22 Oct 2025 09:44:14 +0800</pubDate><description><![CDATA[C++ 标准模板库提供了一个非常重要的内存管理机制——allocator。它对内存管理接口进行了封装，实现了对象内存分配与构造分离、对象析构与内存释放分离。标准库中通过模板参数为容器提供内存管理策略，allocator 就是一种具体的策略，我们可以实现基于共享内存、内存池的 自定义 allocator 把它们应用于容器。本文章将以 MSVC 的 allocator 框架为参考，讲述 allocator 的核心工作原理。]]></description><category></category></item><item><title><![CDATA[Ubuntu 下编译 mbedtls 并使用]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/152935115</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/152935115</guid><author>ypy9323</author><pubDate>Fri, 10 Oct 2025 17:31:52 +0800</pubDate><description><![CDATA[本文介绍 Ubuntu22.04 环境下 mbedtls 库的安装与使用方法。]]></description><category></category></item><item><title><![CDATA[C++新标准——decltype 关键字]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/152663575</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/152663575</guid><author>ypy9323</author><pubDate>Tue, 07 Oct 2025 22:25:48 +0800</pubDate><description><![CDATA[是 C++11 新增的一个关键字，它和 auto 一样，都用来在进行类型推导。它不需要对表达求职即可获得表达式类型。检查实体的声明类型或表达式的类型和值类别。实际应用这些场景：标记符的类型推导函数模板的返回值类型推导Lambda 表达式中 auto&& 类型的形参类型推导函数模板的函数参数的类型推导等。一、语法如果实参是或未加括号的类成员访问表达式，则decltype 产生该表达式所命名实体的类型。若不存在此实体，或实参指代一组重载函数，则程序非良构（编译出错）。]]></description><category></category></item><item><title><![CDATA[C++新标准—— Value categories]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/152610494</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/152610494</guid><author>ypy9323</author><pubDate>Mon, 06 Oct 2025 21:45:43 +0800</pubDate><description><![CDATA[【译】a + b, a % b, a & b, a << b 以及所有其他内置算术表达式。【译】a < b, a == b, a >= b 以及所有其他内置比较表达式。]]></description><category></category></item><item><title><![CDATA[C++ 类型推导（第三部分）]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/152171941</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/152171941</guid><author>ypy9323</author><pubDate>Sat, 27 Sep 2025 22:11:03 +0800</pubDate><description><![CDATA[也就是说当传递给 std::forward 左值时返回一个左值引用，根据定义左值引用是左值；当传递给 std::forward 右值时返回一个右值引用，函数返回的右值是定义为右值的。，但是因为它涉及“万能引用”、“引用折叠”等概念，所以当时先略过，现在储备了这些知识也算是完万事具备了，所以现在探讨这种形式的类型推导。如果任一引用为左值引用，则结果为左值引用。只有两个都是右值引用，结果才是右值引用。C++ 中不允许定义显示定义“引用的引用”，但是在。过程中出现“引用的引用”是允许的。这种信息添加规则决定。]]></description><category></category></item><item><title><![CDATA[C++ 类型推导（第二部分）]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/152162666</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/152162666</guid><author>ypy9323</author><pubDate>Sat, 27 Sep 2025 12:58:49 +0800</pubDate><description><![CDATA[继续讨论 C++ 类型推导—— auto 类型推导。auto 变量定义过程中的类型推导可以分为两种：一种是花括号形式的初始化语句中auto类型推导、另一种是普通形式的初始化语句中auto类型推导。]]></description><category></category></item><item><title><![CDATA[C++ 类型推导（第一部分）]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/151658304</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/151658304</guid><author>ypy9323</author><pubDate>Sat, 13 Sep 2025 23:04:39 +0800</pubDate><description><![CDATA[在调用模板（函数）的时候，编译器会根据实参类型推导模板参数类型和函数参数类型，从而实例化出对应的函数。通常模板参数类型的推导结果与函数参数类型的推导结果不一样,这是因为函数参数类型会有诸如 const、reference、volatile 等修饰符。模板参数类型的推导结果不仅取决于实参类型还依赖函数参数类型的形式]]></description><category></category></item><item><title><![CDATA[C++ 容器——unordered_xxx]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/151294855</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/151294855</guid><author>ypy9323</author><pubDate>Sun, 07 Sep 2025 23:08:59 +0800</pubDate><description><![CDATA[ 自 C++11 开始，STL 引入了基于 hash table 的 unordered_set、unordered_map 等容器，正如其名它们是无序容器。哈希函数是这些容器的核心，也是保证它们高性能的关键。]]></description><category></category></item><item><title><![CDATA[C++运算符重载——函数调用运算符 ()]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/151292726</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/151292726</guid><author>ypy9323</author><pubDate>Sun, 07 Sep 2025 20:12:37 +0800</pubDate><description><![CDATA[函数对象含有不仅于此还包括lambda，使用它们可带来便捷性和高效性。]]></description><category></category></item><item><title><![CDATA[C++ 容器——vector]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/150709847</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/150709847</guid><author>ypy9323</author><pubDate>Sun, 24 Aug 2025 20:08:13 +0800</pubDate><description><![CDATA[vector是表示可以改变大小的数组的序列容器。就像数组一样，vector 使用连续的内存存储元素，这意味着它们的元素也可以使用常量指向其元素的“下标”来访问。但与数组不同，它们的大小可以动态变化，其存储由容器自动处理。]]></description><category></category></item><item><title><![CDATA[C++ 可变参数模板（Variadic Templates）]]></title><link>https://blog.youkuaiyun.com/ypy9323/article/details/150706243</link><guid>https://blog.youkuaiyun.com/ypy9323/article/details/150706243</guid><author>ypy9323</author><pubDate>Sun, 24 Aug 2025 19:21:12 +0800</pubDate><description><![CDATA[main 函数中用参数 1, 56.8f, 'y', "hello" 调用 print 函数会匹配到 template<class T, class... Types> void print(const T &arg, const T& ... args)， 第一个实参1会传给 arg，剩余的参数传给args，然后递归调用函数模板print，这时参数包的第一（56.8f）又会传给 arg，剩余的参数传给args，这样逐步取第一个，直到取完为止。C++11 新标准提出。]]></description><category></category></item></channel></rss>