<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Dr_Jack的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Dr_Jack</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Dr_Jack]]></copyright><item><title><![CDATA[关于noexcept及大三律的实验]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/157943550</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/157943550</guid><author>Dr_Jack</author><pubDate>Tue, 10 Feb 2026 17:58:09 +0800</pubDate><description><![CDATA[摘要：本文探讨了C++中noexcept关键字的重要性，通过实验验证其在STL容器中的关键作用。测试表明，带有noexcept的移动构造函数会在vector扩容时被调用，否则将使用拷贝构造函数。文章还解释了&quot;大三律&quot;原则（Rule of Three），指出声明复制构造、赋值运算符或析构函数中的任何一个时，应同时声明这三个函数。在C++11中，定义移动构造/赋值运算符会阻止编译器生成复制构造函数，反之亦然。这些特性对理解C++对象模型和异常安全至关重要。]]></description><category></category></item><item><title><![CDATA[C++20模板实战tuple展开入参]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/157801239</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/157801239</guid><author>Dr_Jack</author><pubDate>Fri, 06 Feb 2026 11:11:25 +0800</pubDate><description><![CDATA[本文探讨了使用C++20折叠表达式优化神经网络实现的方法。作者通过重载&gt;&gt;和&lt;&lt;运算符实现正反向传播的链式调用，利用折叠表达式简化多层网络的递归逻辑。核心创新点包括：1)使用tuple保存各层网络对象；2)通过std::apply展开tuple参数；3)设计make_reverse_index_sequence实现tuple的反向展开。这种模板元编程方法有效减少了重复代码，提升了神经网络实现的简洁性和可维护性。文章还深入分析了std::apply的实现原理，并扩展了反向展开tuple]]></description><category></category></item><item><title><![CDATA[C++20模板编程模式和惯用法]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/157763224</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/157763224</guid><author>Dr_Jack</author><pubDate>Thu, 05 Feb 2026 14:51:10 +0800</pubDate><description><![CDATA[本文探讨了C++20模板元编程中的三种静态多态模式：CRTP（奇异递归模板模式）、MIXINS（混入）和类型擦除。CRTP通过父类模板实现上层逻辑，子类实现多态细节；MIXINS则相反，子类模板实现上层逻辑，父类提供多态细节；类型擦除通过代理类将无继承关系的类聚合。这三种模式各具特色：CRTP适用于抽象设计减少重复代码，MIXINS用于编译期组合现有类，类型擦除则实现不同类型的行为统一。文章通过代码示例展示了这些模式的实际应用场景和实现机制。]]></description><category></category></item><item><title><![CDATA[cpp-reference关于memory-order的解释]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/155714004</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/155714004</guid><author>Dr_Jack</author><pubDate>Mon, 08 Dec 2025 19:21:03 +0800</pubDate><description><![CDATA[本文详细介绍了C++内存模型中的核心概念与顺序规则。首先解释了线程内的sequence-before和carries dependency关系，然后阐述了原子变量的modification order及其四种同步要求（WW、RR、RW、WR）。文章进一步定义了release sequence、synchronizes-with、dependency-ordered before等跨线程关系，并区分了happens-before、strongly happens-before等不同严格程度的时间顺序概念。最后]]></description><category></category></item><item><title><![CDATA[计算机算法解题技巧]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/155238914</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/155238914</guid><author>Dr_Jack</author><pubDate>Tue, 25 Nov 2025 16:41:13 +0800</pubDate><description><![CDATA[摘要 本文系统总结了算法解题的框架思维，重点强调思路优先于编码，并需保持冷静思考。核心内容包括： 树遍历：详细分析前序、中序、后序遍历的特点及应用场景，指出后序遍历适合需要子节点信息的场景。 动态规划：从名称解析其本质是分阶段决策和状态转移，提出解题五要素：base case、异常处理、状态、选择和DP设计。对比自顶向下（递归+备忘录）和自底向上（DP数组）两种实现方式。 经典问题解析： 零钱兑换：通过状态转移求最小硬币数 LIS问题：展示如何通过历史状态推导当前解 最大子数组和：连续子数组问题的典型解法 ]]></description><category></category></item><item><title><![CDATA[程序员的自我修养（三）]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/153987110</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/153987110</guid><author>Dr_Jack</author><pubDate>Mon, 27 Oct 2025 22:40:33 +0800</pubDate><description><![CDATA[本文介绍了Linux中ELF目标文件格式的分类及分析工具。ELF文件主要分为可重定位文件(.o)、可执行文件、共享目标文件(.so)和核心转储文件四种类型。文章详细讲解了使用objdump命令查看段信息(-h)、内容(-s)和反汇编(-d)的方法，以及使用objcopy将任意文件作为目标文件段的技巧。此外，还介绍了通过GCC属性将变量和函数指定到特定段的语法。这些内容为深入理解ELF文件格式和进行目标文件分析提供了实用指导。]]></description><category></category></item><item><title><![CDATA[程序员的自我修养（二）]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/153964808</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/153964808</guid><author>Dr_Jack</author><pubDate>Mon, 27 Oct 2025 15:55:59 +0800</pubDate><description><![CDATA[该文章概述了程序编译链接的四个主要阶段：预编译、编译、汇编和链接。预编译处理宏定义和文件包含；编译进行词法、语法和语义分析，生成中间代码；汇编将代码转为机器指令；链接则处理符号地址解析和重定位。整个过程将高级语言逐步转换为可执行机器代码。]]></description><category></category></item><item><title><![CDATA[程序员的自我修养（一）]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/153958674</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/153958674</guid><author>Dr_Jack</author><pubDate>Mon, 27 Oct 2025 10:52:10 +0800</pubDate><description><![CDATA[这篇文章回顾了《程序员的自我修养》一书中的核心知识要点，主要包括：计算机硬件架构（CPU通过北桥/南桥与设备通信）、对称多处理器概念、计算机层级接口（应用层-运行库-操作系统-硬件）、内存管理机制（虚拟内存与MMU映射）以及线程调度策略（IO密集型线程优先级更高）。文章以技术干货为主，适合有一定基础的读者复习计算机系统底层原理。]]></description><category></category></item><item><title><![CDATA[C++多重继承及虚继承内存结构]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/153787744</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/153787744</guid><author>Dr_Jack</author><pubDate>Thu, 23 Oct 2025 18:03:22 +0800</pubDate><description><![CDATA[本文探讨了C++中多继承与虚继承的内存分布情况。在多继承示例中，子类derived继承base1和base2，虚表分析显示base1虚表与子类合并，base2单独成表。虚继承示例中，base1和base2虚继承baseofbase，内存布局显示祖父类出现在对象末尾且只有一个虚表。通过gdb调试和内存地址分析，揭示了强制类型转换的实质是父类指针赋值，以及虚继承如何避免重复基类问题。文章最后图示了虚继承类对象的内存分布结构。]]></description><category></category></item><item><title><![CDATA[Linux从网卡接收到内核软中断处理整体流程]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/148055852</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/148055852</guid><author>Dr_Jack</author><pubDate>Mon, 19 May 2025 09:34:42 +0800</pubDate><description><![CDATA[启动软中断处理内核线程ksoftirqb;注册软中断回调函数；发送软中断回调；接收软中断回调;注册协议栈；IP协议放在ptype_base数组中；应用层协议放在inet_protos数组中；]]></description><category></category></item><item><title><![CDATA[libco协程实现方式梳理]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/147506245</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/147506245</guid><author>Dr_Jack</author><pubDate>Fri, 25 Apr 2025 13:39:20 +0800</pubDate><description><![CDATA[可以看到，这个函数很简单，很纯粹就是调用co->pfn这个函数指针的方法，传入的参数就是co->arg，这2个参数是在co_create_env函数的第31行和第32行写入的。判断当前的协程是不是已经开始（co->cStart），可以在co_create_env函数的第49行看到，这个标志位是置0的；这里有一个要注意的是，通过co_create函数创建的stCoRoutine_t对象并没有被删除，所以如果需要删除对象需要手动调用一下co_release函数释放这个协程占用的资源。]]></description><category></category></item><item><title><![CDATA[cuda手搓CNN识别手写数字]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/145489038</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/145489038</guid><author>Dr_Jack</author><pubDate>Fri, 07 Feb 2025 10:46:28 +0800</pubDate><description><![CDATA[手搓cnn，结合c++模板编程和cuda。]]></description><category></category></item><item><title><![CDATA[cuda从零开始手搓PB神经网络]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/145207401</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/145207401</guid><author>Dr_Jack</author><pubDate>Fri, 17 Jan 2025 14:49:20 +0800</pubDate><description><![CDATA[基于上一篇的矩阵点乘，实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。可以看出，经过8000次的训练，这个使用sigmoid激活函数、NAdam优化、Xavier-Gaussian初始化的32。虽然这对于我的工作没有任何关系，但是我还是想搞一下。毕竟“越是没用的知识就越有用，越是有用的东西就越没用”。32的PB能够将误差缩减到0.0001这个量级，而训练时间仅为8.54秒。下面实验一下我们的bp神经网络。]]></description><category></category></item><item><title><![CDATA[cuda矩阵点乘计算实现]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/145140969</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/145140969</guid><author>Dr_Jack</author><pubDate>Tue, 14 Jan 2025 15:45:52 +0800</pubDate><description><![CDATA[矩阵的点乘运算可以看做把两个矩阵A和B，A的行和B的列结合在一起，形成一个正方体。正方体中每个坐标位置的值为其坐标投影位置值相乘。得出的值为沿着A的行（即B的列）方向，将正方体中元素的值进行求和。这个程序定义了2个30*30的对角矩阵进行点乘运算。基于以上认知，设计了一个cuda程序，用于计算矩阵的乘法。可以看到，正确计算出了点乘的结果。]]></description><category></category></item><item><title><![CDATA[GO语言写Prometheus自定义node-exporter的Docker容器测试]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/138175675</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/138175675</guid><author>Dr_Jack</author><pubDate>Thu, 25 Apr 2024 09:53:17 +0800</pubDate><description><![CDATA[执行以下命令，安装docker-compose到CentOS7.9环境中：
安装完成后输入命令验证docker-compose安装成功：
2. 使用go语言编写node-exporter
创建文件夹04_prometheus_test，执行以下命令初始化go环境：
由于需要用到prometheus的go语言sdk，所以需要下载包：
执行完成后写代码：
这个程序暴露:8080/metrics给prometheus获取数据，:8080/hello可以增加计数。
执行编译生成可执行文件:
3. d]]></description><category></category></item><item><title><![CDATA[汇编——SSE打包整数]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/137479612</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/137479612</guid><author>Dr_Jack</author><pubDate>Sun, 07 Apr 2024 22:00:31 +0800</pubDate><description><![CDATA[以上代码展现了两个整数向量的相加操作，并且将结果向量反向写进一个向量，然后输出。]]></description><category></category></item><item><title><![CDATA[汇编——SSE对齐]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/137248825</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/137248825</guid><author>Dr_Jack</author><pubDate>Mon, 01 Apr 2024 22:28:24 +0800</pubDate><description><![CDATA[这是一篇简单的介绍文章。]]></description><category></category></item><item><title><![CDATA[libco——源码分析（一）]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/135778193</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/135778193</guid><author>Dr_Jack</author><pubDate>Tue, 23 Jan 2024 18:00:19 +0800</pubDate><description><![CDATA[总体的网络服务器操作流程是这样的：fill:#333;co_pollother增加epoll_fd监听文件描述符将自己的协程增加到计时队列中发送网络消息或者其他被激活的文件描述符放到激活队列loop取出超时队列中超时的任务放到超时队列将超时队列黏贴到激活队列末尾激活元素的回调函数处理resume挂起的协程loop写入收到消息的数据并返回上层loopco_pollother。]]></description><category></category></item><item><title><![CDATA[shared_ptr多线程安全性]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/135552569</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/135552569</guid><author>Dr_Jack</author><pubDate>Fri, 12 Jan 2024 14:56:43 +0800</pubDate><description><![CDATA[shared_ptr的计数对象是原子的，但是有一个问题，就是在析构之前shared_ptr调用父类__shared_ptr的析构，__shared_ptr有一个__shared_count成员，这个成员的析构里面调用了其指针成员_Sp_counted_base的方法_M_release，而这个_M_release里面则调用__gnu_cxx::__exchange_and_add_dispatch方法对计数进行-1操作，如果原来的计数为1那么就调用_M_dispose方法将对象执行删除了。]]></description><category></category></item><item><title><![CDATA[memory_order——概念及定义说明]]></title><link>https://blog.youkuaiyun.com/Dr_Jack/article/details/135520119</link><guid>https://blog.youkuaiyun.com/Dr_Jack/article/details/135520119</guid><author>Dr_Jack</author><pubDate>Thu, 11 Jan 2024 10:09:02 +0800</pubDate><description><![CDATA[在相同的线程，求值A可能sequenced-before求值B，就像求值顺序中描述的一样。]]></description><category></category></item></channel></rss>