模板编译期计算:从模板元编程到constexpr的进阶实践
模板编译期计算把“计算”这件事彻底塞给编译器写过几年C的老哥应该都有这种体会很多代码写出来其实根本不是给运行时的CPU跑的而是写给编译器看的。你想要的不是“程序运行时算出一个结果”而是“代码编译期间就已经把该算的算完运行时直接拿走用”。这就是模板编译期计算——C模板元编程最核心、也最容易被新手误解的一块。先说清楚它解决什么问题。举个最朴素的例子你想在代码里计算5!普通写法是写一个函数运行时调用、循环累乘。模板编译期计算的写法是把阶乘拆成模板递归编译器在实例化模板时就完成了乘法展开最终在二进制里直接留下常量120。程序运行时不产生任何计算开销。这个能力意味着什么意味着你可以把一部分“程序逻辑”从运行期搬到编译期换来的是运行时性能的提升、错误的提前暴露、以及代码表达能力的跃升。对于写高性能库、底层框架、嵌入式固件、游戏引擎的开发者来说这是和constexpr并列的一把利器。对普通业务开发来说了解它的思路也能帮你读懂很多现代C开源项目的源码。这篇文章我不打算讲晦涩的编译器原理推导而是从一个实际从业者的角度把“模板编译期计算”的设计思路、常用手法、实际案例、以及我在工程中踩过的坑完整走一遍。内容偏实战尽量做到看完能上手。1. 思路拆解为什么要把计算交给编译器聊具体语法之前先说说编译期计算这套思路的底层逻辑。理解了这个后面看模板代码就不会觉得是一堆“魔法”。1.1 运行期与编译期的本质区别程序从源码到可执行文件大致经过预处理、编译、汇编、链接几个阶段。我们平时写的普通函数、普通变量统统是“运行期”的产物——代码被编译成指令变量在内存中被创建、赋值、销毁。而模板编译期计算发生在“编译期”这一阶段它有两个关键特征计算需要的“数据”必须是编译器能确定的常量或者类型信息计算的过程表现为“模板实例化”也就是编译器按照你定义的模板规则递归或特化地生成最终的代码实体。用一个生活化的类比普通函数是“你写好菜谱客人点菜的时候现做”编译期计算是“你先按菜谱把菜全部做好封装好客人一来直接拿”。后者的好处是上菜快坏处是——备菜阶段编译会花更多时间而且菜谱本身要写得更精细。这就是模板编译期计算的根本取舍用编译时间换运行时间用复杂度换性能用类型安全换自由度。1.2 模板作为“编译期的函数”模板在C里诞生之初是为了泛型——写一份代码支持多种类型。但模板的能力远不止类型参数化。因为模板在编译期会被“展开”所以它本质上构成了一套图灵完备的“编译期编程语言”。你把模板看作一个“编译期函数”模板参数就是“函数入参”可以是类型可以是整型常量可以是模板模板参数模板特化就是“函数重载/分支判断”编译器根据实参匹配最合适的特化版本模板递归实例化就是“循环/递归调用”逐层展开直到达到终止条件typename/表达式结果就是“返回值”常见的载体是::value、::type这类嵌套定义。这套体系从C98时代就已经基本成型后来C11到C20补充了大量工具但核心思想没变你描述规则编译器帮你展开计算。1.3 什么时候值得用编译期计算我见过不少初学者刚接触模板元编程就跟打了鸡血一样什么都想塞进编译期结果编译时间爆炸、报错信息天书级、代码可读性趋近于零。工程上的正确姿势是分场景取舍。这几类情况我建议优先考虑编译期方案查表/常量计算例如CRC查表、静态哈希、等比数列求和这些运行期算和编译期算结果一样但编译期算可以存成static constexpr数组运行时零开销。类型派发的条件判断例如根据is_integral、is_pointer在编译期分叉决定走哪个重载或哪段逻辑。编译期断言用static_assert把不满足条件的使用场景在编译期直接卡死避免运行时炸。性能敏感的热路径帧循环、数据包解析、序列化反序列化等高频调用点任何能在编译期消化的计算都值得做。反过来如果程序本身性能不敏感代码也只跑一遍强行编译期计算反而吃力不讨好。判断标准很简单这段代码运行期调用的频率有多高结果是否编译期就能确定报错的可读性能不能接受三个问题想清楚了再动手。2. 核心基础模板编译期计算的三个法器进入实操之前先把最常打交道的三个基础工具过一遍模板特化、递归实例化、类型萃取。这三样就像扳手螺丝刀绝大多数编译期计算都是它们的组合。2.1 类模板与模板特化编译期的“分支判断”模板特化是编译期计算的基石。你可以定义主模板再定义若干“特化版本”编译器实例化时自动选择最匹配的那一个。// 主模板默认情况 template bool Condition struct CompileTimeBranch { static constexpr int value 1; }; // 特化Condition true 时走这里 template struct CompileTimeBranchtrue { static constexpr int value 2; }; static_assert(CompileTimeBranchtrue::value 2); static_assert(CompileTimeBranchfalse::value 1);这个用法相当于编译期的if-else。仔细体会一下这里的“分支”不是运行时CPU跳转而是编译器选择实例化哪个模板。当Condition是true时CompileTimeBranchfalse这个特化根本不会被实例化相关的代码实体不会生成。偏特化则提供了更灵活的匹配维度——你可以针对“指针类型”“整型”“void类型”等做分支template typename T struct IsPointer { static constexpr bool value false; }; template typename T struct IsPointerT* { static constexpr bool value true; }; static_assert(IsPointerint::value false); static_assert(IsPointerint*::value true);这种“根据类型形态做编译期判断”的能力就是类型萃取最初的原型。2.2 模板递归实例化编译期的“循环”模板可以在实例化过程中引用自身编译器会一层层展开实例化直到某个特化版本把它“截断”。阶乘是最经典的入门例子template int N struct Factorial { static constexpr int value N * FactorialN - 1::value; }; // 终止条件0! 1 template struct Factorial0 { static constexpr int value 1; }; static_assert(Factorial5::value 120);展开过程大概是这样的Factorial5展开求值5 * Factorial4继续展开4 * Factorial3直到Factorial0命中特化直接返回1。编译器把这一整条链在编译期算完最后Factorial5::value就是一个整型常量120。这里有两个关键点。第一递归必须有终止条件而且必须用“特化/偏特化”来构造否则实例化永远停不下来编译器会报“递归模板实例化超过最大深度”。第二展开深度是有限制的默认模板实例化深度在常见编译器中是1024层左右可以用-ftemplate-depth调大但不建议依赖调大来硬扛。2.3 类型萃取编译期的“类型函数”类型萃取本质上是“以类型为参数、以类型/常量/布尔值为返回值的编译期函数”。现代C标准库已经提供了非常丰富的萃取工具分布在type_traits里std::is_integral、std::is_same、std::remove_reference、std::enable_if等等。我们自己也能轻松实现一个简化版本理解原理template typename T, typename U struct IsSameType { static constexpr bool value false; }; template typename T struct IsSameTypeT, T { static constexpr bool value true; }; static_assert(IsSameTypeint, int::value); static_assert(!IsSameTypeint, double::value);模板偏特化匹配“同一个类型”从而得到true。这个IsSameType就是std::is_same的底层原理。实际工程中我一般直接使用type_traits但理解底层能把很多抽象概念落到实处。对于C11之前的老派项目标准库没有type_traits时这种自研萃取是唯一出路。现在环境如果不是特别老旧直接上标准库即可。3. 进阶实战从阶乘到编译期排序基础语法看完了现在切入真实案例。这个环节我会把编译期计算的典型应用拆开揉碎给出可直接抄的模板代码。3.1 编译期斐波那契数列阶乘之后惯例是斐波那契。它比阶乘多了一层递归分支能更好地展示编译期递归的分治结构template int N struct Fibonacci { static constexpr int value FibonacciN - 1::value FibonacciN - 2::value; }; template struct Fibonacci0 { static constexpr int value 0; }; template struct Fibonacci1 { static constexpr int value 1; }; static_assert(Fibonacci10::value 55);算一下复杂度你会发现模板递归的斐波那契的实例化树是爆炸的——Fibonacci40会实例化成千上万个中间节点。这在实际工程里要慎用。它适合教学但不适合生产。真在编译期需要序列生成时优先用std::integer_sequenceconstexpr函数或者 C17 之后的if constexpr来写实例化体积小得多。3.2 用if constexpr优雅替代传统特化分支C17以后if constexpr把很多编译期分支的写法大幅简化。传统写法里你要写偏特化、写std::enable_if来约束重载现在可以直接在函数体里写template typename T auto GetValue(T v) { if constexpr (std::is_integral_vT) { return v 1; } else { return v; // 非整型直接返回原值 } }注意这里的else分支在T是整型时编译器不会真的实例化它。if constexpr的语义是“在模板实例化期间就确定分支”未被选中的分支代码不参与实例化。这比“运行时if”更严格也比“传统模板特化”更贴近普通人的思维习惯。我在实际项目里if constexpr用得比老式偏特化多得多。最典型的场景是泛型容器序列化根据类型分类走不同序列化逻辑几个if constexpr搞定代码清晰度直接上一个档次。3.3 编译期整数序列与包展开C14引入了std::integer_sequence配套std::index_sequence专门用来生成编译期的整数序列。它和参数包展开配合能实现“编译期批量生成代码”的效果。一个经典场景把std::tuple按索引逐一展开。假设你想打印一个tuple的所有元素template typename Tuple, std::size_t... I void PrintTupleImpl(const Tuple t, std::index_sequenceI...) { ((std::cout std::getI(t) ), ...); } template typename... Args void PrintTuple(const std::tupleArgs... t) { PrintTupleImpl(t, std::make_index_sequencesizeof...(Args)()); }这里std::make_index_sequenceN在编译期生成0, 1, 2, ..., N-1的序列参数包展开时把这些索引依次代入std::getI实现了对tuple各个元素的遍历。运行时你看到的是一个输出语句实际上编译器替你生成了一连串std::get0、std::get1、std::get2的调用。这正是模板编译期计算的高阶形态——不光是算数值还能生成代码结构。3.4 真正硬核编译期选择排序数值计算是基础演示真正体现编译期计算威力的是“编译期排序算法”。假设你需要在编译期把一个整数序列排好序存成常量数组供运行时使用。C17的constexpr函数让这个实现变得非常直观但为了演示模板递归思路这里给出一个传统模板元编程风格的版本简化版选择排序template int... Values struct IntList { static constexpr std::size_t size sizeof...(Values); }; // 编译期取出最小值 template int First, int... Rest struct MinValue { static constexpr int value (First MinValueRest...::value) ? First : MinValueRest...::value; }; template int Only struct MinValueOnly { static constexpr int value Only; }; // 编译期从列表中移除某个值 template int Target, int... Values struct RemoveValue; template int Target struct RemoveValueTarget { using type IntList; }; template int Target, int First, int... Rest struct RemoveValueTarget, First, Rest... { using type std::conditional_t First Target, typename RemoveValueTarget, Rest...::type, typename IntListJoinIntListFirst, typename RemoveValueTarget, Rest...::type::type; };这个代码需要额外的IntListJoin拼接工具写起来相当繁琐。实际项目中我强烈建议直接用constexpr函数替代这类传统模板递归排序。C14之后constexpr函数体内已经支持循环、局部变量排序算法写起来和普通函数几乎没区别编译器同样能在编译期求值#include algorithm constexpr int SortedArray[5] [] { int arr[5] {5, 3, 1, 4, 2}; std::sort(std::begin(arr), std::end(arr)); return arr; }();等等这里std::sort在constexpr环境里能否用取决于标准库实现是否支持。C20以后std::sort在constexpr中可用但更稳妥的手法是手写一个简单的冒泡或选择排序。编译期排序的这个例子其实反映了一个趋势传统模板元编程的很多场景正在被constexpr函数和if constexpr逐步替代但模板特化与递归的思想依然是理解它们的底层骨架。4. 工具选型传统TMP与现代constexpr的取舍从上面的实例能看出C标准演进之后“模板编译期计算”的写法和工具早已不是C98时代那一套了。这个章节专门聊聊选型。4.1 C98/03时代纯模板元编程那个年代没有constexpr没有if constexpr没有std::integer_sequence所有编译期计算都得用类模板特化递归typedef/枚举值硬扛。代码极度晦涩“读代码五分钟认语法半小时”是常态。经典库如Boost.MPL就是这一时期的产物。这种写法的价值在于揭示底层原理但工程上不建议再用。如果项目还在C11以下升级编译器是首要任务。4.2 C11/14constexpr崛起C11引入constexpr让“函数”也能在编译期求值。C14进一步放开constexpr函数里允许for循环、局部变量、if分支。这意味着大部分算法可以直接写成正常的函数形式同时满足编译期计算需求。现代写编译期计算我的默认首选是constexpr函数 static_assert组合。举个例子编译期计算一个字符串的长度constexpr std::size_t StrLen(const char* s) { std::size_t len 0; while (s[len] ! \0) { len; } return len; } static_assert(StrLen(hello) 5);简洁、清晰、可调试。传统的模板递归写法要写一长串特化完全没有必要。4.3 C17/20if constexpr与constevalC17的if constexpr彻底简化编译期分支的判断逻辑C20引入consteval强制函数必须在编译期求值否则报错——这比constexpr允许运行时求值更严格适合那些“本来就应该编译期算”的计算。有了这些工具之后我的选型原则变得很清晰场景推荐方案理由简单常量计算constexpr函数直观、可读性好类型分支逻辑if constexpr语法自然无需特化迷宫必须编译期求值的元函数consteval编译器强制校验类型萃取与约束type_traitsrequires标准库完备语义准确序列生成std::integer_sequence配合展开效率高纯类型操作类模板偏特化类型层面的匹配仍是偏特化的主场这里我多说一句传统模板元编程没有彻底死亡偏特化在处理“类型形态”上仍有不可替代的优势。要判断一个类型是不是std::vectorint偏特化三行搞定用constexpr函数反而要绕远路。两者是互补关系而不是替代关系。4.4 什么时候坚决不上编译期计算模板编译期计算不是银弹。我自己踩过的坑很明确编译时间爆炸大型项目里递归实例化动辄上千层每层都涉及大量类型展开编译时间直接从秒级变分钟级。这个代价必须提前评估。报错信息灾难模板实例化报错动辄几十上百行阅读体验极差。现代编译器对if constexpr和requires的报错稍好但偏特化展开类的报错依旧能让人头秃。二进制体积膨胀每个不同的模板实参都会实例化一份独立代码。如果某个编译期计算路径分支很多代码体积增长显著。调试困难编译期计算没法下断点、没法打印中间结果。排查问题基本靠static_assert逐步缩圈。个人建议编译期计算优先用constexpr只在不得不用模板特化的类型匹配场景才碰老式TMP每次加一段编译期逻辑先问问“非它不可吗”。5. 避坑与排查编译期报错的常见解读这个章节最贴近实战。模板编译期计算的报错和信息排查跟普通运行时bug完全不是一回事。我整理几个高频场景附上处理思路。5.1 递归实例化深处的“invalid use of incomplete type”这是模板元编程最常见的报错之一。举个例子你写了一个递归模板但忘写了终止特化template int N struct Sum { static constexpr int value N SumN - 1::value; };没有特化版本收敛编译器会无限展开Sum1、Sum0、Sum-1……最终在达到实例化深度上限时报错。实际上编译器还会给出一个笼统的“incomplete type”或“recursive template instantiation exceeded maximum depth”。处理方式先查递归模板的终止特化是否存在、是否被正确匹配。静态检查时可以直接在正下方补一个特化并static_assert验证。5.2 报错信息过长怎么快速定位根因模板报错往往是一串嵌套实例化的“上下文栈”。我的习惯是从下往上读先看最后一个“required from here”指向的代码行——这是触发实例化的源头再看最近一个static_assert失败信息——如果自己写了static_assert这里往往直接告诉你哪个条件不满足最后再往上追溯模板定义本身。在GCC/Clang下可以用-fdiagnostics-show-template-treeGCC或-fmacro-backtrace-limit0这类参数精简输出。Clang的模板报错质量整体优于GCC日常写模板元编程我更偏爱Clang。5.3 替换失败不是错误SFINAE相关的坑SFINAESubstitution Failure Is Not An Error在模板匹配中极其关键。它的意思是当某个模板实例化时如果替换模板参数导致某个表达式非法编译器不会立刻报错而是把这个模板从候选集中移除继续找其他可用重载。最常见的配合工具是std::enable_if。但这个机制有经典坑——std::enable_if条件的求值依赖模板参数如果条件里用了不存在的成员类型可能导致匹配失败但没有任何错误提示代码“静默地”走了另一个重载。解决思路很简单在static_assert里把条件显式验证一遍。例如static_assert(std::is_same_vtypename std::remove_referenceT::type, T, T should be non-reference type);这么写即使SFINAE把某些重载淘汰了你也能从静态断言里看到真实原因而不是面对一个诡异的“啥也没发生”。5.4 编译期计算的“条件分支”必须收敛传统模板元编程的分支判断依赖特化匹配。如果偏特化条件写得过于宽泛编译器会选择“不匹配”的主模板如果条件过于严格又会全部落入主模板导致递归停不下来。最典型的失误场景偏特化条件依赖某个::value但这个value本身又依赖外层的模板参数形成循环依赖。遇到这种情况我的建议是拆成两步第一步先通过一个中间模板把条件计算出来第二步再根据结果选择std::conditional_t或偏特化路径。这样可以避免循环依赖也让逻辑更清晰。5.5 快速排查速查表症状可能原因优先检查递归模板无限展开缺少终止特化/特化未被匹配检查特化条件是否覆盖终止值incomplete type访问了未定义的成员类型检查模板定义里的typename和::typeno matching functionSFINAE把重载全淘汰了逐项验证enable_if条件的真假constexpr函数运行期被调用忘了加consteval或调用点在非常量上下文检查调用点是否传入非常量实参编译时间暴涨模板展开层级过多使用-ftemplate-depth调低上限观察优化算法结构6. 一番实战体验后的小结最后说点掏心窝的话。模板编译期计算这套东西入门门槛确实不低尤其是面对一屏一屏的模板报错时很容易劝退。我自己也是从“把阶乘模板抄下来编译半天不知道在干嘛”的阶段过来的。真正让我开窍的是意识到“模板不是一种语法糖而是一套编译期的解释器”。你写的每个模板都在替编译器描述一套展开规则每一次实例化都是编译器在执行一次计算。想明白这一点再去读那些模板元编程的代码就不会觉得它们是在炫技而只是在表达“这一段逻辑运行期不需要提前算了吧”。实际操作中我现在写编译期计算的优先级非常固定优先constexpr需要分支用if constexpr涉及类型匹配用偏特化涉及序列用index_sequence最后再辅助static_assert验证。遇到传统TMP老代码也能看懂、能改但不再主动在生产代码里制造“模板迷宫”。另外一个小技巧收尾如果你不确定一段计算到底有没有被编译器在编译期确认可以在代码里加一个static_assert用例来验证编译通过就说明结果确实是编译期常量。这比盯着constexpr关键字猜来猜去靠谱得多。模板编译期计算的本质是让开发者在“程序运行前”就完成一部分确定性的工作。它不会替你解决所有问题但在性能敏感、类型安全的场景里它会是你工具箱里非常锋利的一把刀。

相关新闻

Flink数据倾斜实战:定位热点Key与加盐两阶段聚合治理

Flink数据倾斜实战:定位热点Key与加盐两阶段聚合治理

做实时数仓的同行,大概率都经历过这样的深夜:一个运行了半年的 Flink 数据倾斜问题突然爆发,某个并行子任务 CPU 直接打满,Kafka 消费延迟像坐火箭一样往上蹿,而相邻的 TaskManager 却闲得发慌。群里开始刷屏&#xff…

2026/10/9 12:50:25 阅读更多 →
彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”,TaoToken统一Key接入实录

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”,TaoToken统一Key接入实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 12:50:25 阅读更多 →
Python数据分析实战工具箱:从清洗到可视化的完整指南

Python数据分析实战工具箱:从清洗到可视化的完整指南

做了五年业务数据分析,电脑里换过不少工具,但最后每天都会打开的,还是那套Python 工具箱。从给运营部门写周报自动化,到清洗几百万行订单明细,再到用 sklearn 搭一个简单的流失预测模型,Python 这三个词基本…

2026/10/9 12:50:25 阅读更多 →

最新新闻

双端影视APP源码修复实战:从编译失败到可调试基线

双端影视APP源码修复实战:从编译失败到可调试基线

简介:这是一套开箱即用的双端影视APP无加密修复版源码,面向有苹果CMS建站基础的开发者或个人站长,解决影视类小程序/APP快速落地、双端(AndroidiOS)同步上线及商业化运营难题。资源包含673个文件,以312张UI…

2026/10/9 13:56:49 阅读更多 →
VSCode tasks.json 变量替换全解析:从 ${file} 到 ${input} 的避坑指南

VSCode tasks.json 变量替换全解析:从 ${file} 到 ${input} 的避坑指南

简介:这份PDF资料聚焦VSCode tasks.json中的各类替换变量,面向使用VSCode进行任务配置的开发者,尤其是需要编写构建、编译、自动化脚本的中级用户。内容系统梳理了${workspaceFolder}、${file}、${fileBasename}、${fileDirname}、${relative…

2026/10/9 13:56:49 阅读更多 →
题解:洛谷 P2909 [USACO08OPEN] Cow Cars S

题解:洛谷 P2909 [USACO08OPEN] Cow Cars S

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

2026/10/9 13:56:49 阅读更多 →
自动化测试入门到进阶:从接口到UI打造稳定高效测试体系

自动化测试入门到进阶:从接口到UI打造稳定高效测试体系

只要你打开任何一个测试岗位的招聘要求,几乎都能看到“熟悉自动化测试”这一条。很多刚入行或者转行的朋友,第一反应是自动化测试是不是对代码要求特别高,是不是只有大厂才玩得转。我做了几年测试开发和自动化测试落地,想说句实话…

2026/10/9 13:56:49 阅读更多 →
Windows 本地部署微信群机器人实践:WuWu WXBot 架构拆解与配置要点

Windows 本地部署微信群机器人实践:WuWu WXBot 架构拆解与配置要点

一、问题背景与选型依据 先说清要解决什么问题。我手上有 200 来个客户群和若干私聊,原始状态是: 消息靠"未读红点"人工判断,群一多必然漏读,且漏了无法回溯;同一个问题一天重复回答几十次;加人就…

2026/10/9 13:56:49 阅读更多 →
Manus联合创始人拆解:Claude与阿里千问双模型驱动下的TaoToken统一API接入实践

Manus联合创始人拆解:Claude与阿里千问双模型驱动下的TaoToken统一API接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 13:55:48 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →