- 博客(883)
- 资源 (21)
- 问答 (1)
- 收藏
- 关注
原创 模板编程—模板和元编程中的错误输出
本文探讨了泛型编程中的编译错误调试方法。针对模板编程中常见的类型不匹配、约束检查失败等问题,提出了多种编译期调试手段:1)使用static_assert进行静态断言;2)利用#warning或#pragma message输出预处理信息;3)通过SFINAE技术结合static_assert输出错误;4)自定义错误输出模板;5)使用宏定义辅助调试。文章详细介绍了各种方法的实现原理,并提供了具体示例代码,特别是展示了如何利用编译错误信息输出调试内容。最后强调开发者应积累自定义辅助类,以更高效地定位和解决泛型编
2026-01-09 08:14:44
536
原创 跟我学C++中级篇——Linux中文件和链接及重定向
学习一些Linux的基本知识点时,完全可以从开发的角度来看。特别是内核是开源的,有什么不明白的细节,打开源码搜索到相关的位置就一目了然了。再次引用侯先生的话“源码之前,了无秘密”!再掌握了相关的应用后,从编码的角度再造一次轮子,可以更加深刻的理解设计的目的和思想,提高开发者自身的认知水平和编程方式。与诸君共勉!
2026-01-08 15:29:01
369
原创 跟我学C++中级篇——对类const关键字的分析说明
本文对比分析了C++中四个相似关键字const、constexpr、consteval和constinit的区别与应用场景。const用于运行时只读控制,constexpr支持编译期计算,consteval强制编译期求值函数,constinit确保静态变量的编译期初始化。文章通过示例代码展示了各关键字的具体用法,并指出应根据实际需求选择合适的关键字,同时考虑C++标准版本差异,以编写安全高效的代码。重点在于理解各关键字在编译期与运行期行为上的差异,以及它们在接口约束、编译期计算和初始化控制等场景下的适用性。
2026-01-07 11:52:13
347
1
原创 跟我学C++中级篇——取地址操作
本文分析了C++中取地址操作的两种方式:传统"&"运算符和C++11引入的std::addressof函数。文章详细介绍了std::addressof的实现原理,包括基于编译器内置函数和非内置函数的两种实现方式,并解释了其强制转换为char引用的原因。通过示例说明了当类重载了&运算符时,std::addressof仍能正确获取对象地址的特性。最后总结了std::addressof的应用场景和限制,指出它是"&"运算符的完善补充,特别适用于模板编
2026-01-06 11:49:15
772
原创 跟我学C++中级篇——constinit避免SIOF
本文分析了C++中的静态初始化顺序问题(SIOF),指出跨单元编译时依赖的全局变量初始化顺序不确定性是导致该问题的根本原因。文章阐述了静态初始化和动态初始化的区别,介绍了constinit关键字通过强制编译期初始化来避免SIOF的原理,同时也指出了其局限性:无法处理运行时动态初始化和非字面类型的情况。最后强调constinit体现了C++在灵活性与安全性之间的平衡,通过编译期约束为动态特性提供保障。
2026-01-05 12:08:42
290
2
原创 跟我学C++中级篇——宏与constexpr
本文对比了C++中宏与constexpr的差异:宏仅进行文本替换,不进行类型检查且作用域不受限,适用于预处理和条件编译;constexpr则进行强类型检查,受作用域限制,支持编译期计算和复杂操作,调试更友好。虽然constexpr在大多数场景下更优,但宏在条件编译等特殊场景仍有优势。开发者应根据具体需求选择合适方案,权衡可维护性与功能需求。
2026-01-04 11:13:42
548
2
原创 C++编程实践——链式调用的实践
本文探讨了C++中链式调用的实现与应用。链式调用通过返回对象引用或指针实现连续函数调用,使代码更简洁直观。文章介绍了四种实现方式:返回对象指针/引用、流畅接口、运算符重载和CRTP技术,并分析了链式调用在设计模式、异步编程等场景中的应用。最后通过观察者模式示例展示了链式调用的实际应用,同时也指出其调试困难和异常处理复杂等缺点。总体而言,链式调用是一种提高代码可读性的有效手段,但需根据具体场景权衡使用。
2026-01-04 11:11:47
784
原创 并行编程实战——CUDA编程的统一内存的预取
本文探讨了CUDA编程中的数据预取优化技术。首先介绍了cudaMemPrefetchAsync函数及其参数,说明数据预取可减少内存延迟、提高性能,但需注意预取时机和数量以避免性能下降。其次分析了数据预取的三种应用场景:计算前后预取、分批预取和多流预取,并介绍了相关API如cudaMemAdvise和cudaMemRangeGetAttribute。通过示例代码演示了GPU预取、分批预取和流式预取的实现方式,指出不同场景下的适用性。最后强调GPU与CPU应协作解决问题,虽然实现方式不同,但都遵循计算机开发的基
2026-01-03 09:55:29
302
原创 跟我学C++中级篇——is_detected的手动实现
本文介绍了C++中的"检测习惯用法"(detection idiom)技术,该技术由Walter E. Brown提出,用于在编译期检测类型特性是否存在或表达式是否有效。虽然is_detected未能进入C++17标准库,但其功能已被std::void_t和C++20概念部分替代。文章详细分析了实验库中的is_detected定义及其三种主要用途:检测类型特性、验证表达式有效性和控制编译分支。通过示例代码展示了如何检测类的复制赋值操作符是否存在等实际应用,并提供了手动实现的代码方案,包括
2026-01-03 09:53:16
586
原创 C++23中的模块应用说明之三深入分析和混合编程
本文探讨了C++20模块机制的应用与组织。模块将代码划分为接口单元、实现单元和分区,通过BMI文件管理依赖关系,显著提升编译效率并解决传统头文件污染问题。文章分析了模块编译流程和混合编程策略,提出渐进式迁移方案:新工程优先采用模块,旧代码选择性封装,并展示模块与头文件混合使用的实例。最后强调模块化开发需系统规划层级结构,合理控制粒度,通过模块与传统机制的协同实现工程代码的高效组织与安全编译。
2026-01-02 08:18:22
662
原创 C++23中的模块应用说明之二整体说明和导出控制
本文介绍了C++20模块系统的基本语法和使用方法,主要包括四种模块声明方式:1)模块导出声明,用于定义主模块接口或实现单元;2)导出声明语句块,控制符号的可见性;3)模块导入并重新导出,实现接口聚合;4)全局模块和私有模块片段,管理模块作用域。文章还详细说明了模块分区的定义和使用,通过冒号语法将模块划分为多个分区单元,并演示了如何通过导入分区来构建模块接口。这些特性为C++提供了更好的代码组织和封装机制。
2026-01-02 08:15:06
686
原创 跟我学C++中级篇——类型检测和安全控制
本文系统梳理了C++中类型检测与安全控制的技术方法。编译期技术包括SFINAE、标准库元编程接口、C++20概念、自定义模板及断言等;运行期技术涵盖RTTI、接口限制、容器检测和类型转换等。文章分析了各类技术的优缺点:编译期方法功能强大但复杂度高,运行期方法简单但扩展性差。在应用场景上,编译期技术适合基础库开发,运行期技术更适合常规开发。通过实例代码展示了运行时类型检测和编译期模板检测的具体实现,为开发者选择合适的技术方案提供了参考指南。
2026-01-02 08:11:34
686
原创 C++编程实践—false_type和true_type的实践应用
本文系统介绍了C++中std::true_type和std::false_type的应用方式。这两种类型继承自std::integral_constant<bool, true/false>,主要用于模板元编程。其应用形式包括:1)作为基类实现类型特征检测(如std::is_pointer);2)用于标签分发处理,通过函数重载实现不同的处理逻辑。文中给出了类型转换检查的实现示例,并展示了std::is_function的源码实现,说明如何通过特化继承true_type/false_type来实现
2026-01-01 09:43:06
1018
原创 C++编程实践——std::void_t的实践应用
本文分析了C++17中的std::void_t及其工程应用。std::void_t通过变参模板将任意类型映射为void,其本质依赖SFINAE技术。文章详细介绍了std::void_t的三种主要应用方式:作为默认参数、触发SFINAE和模板特化处理,并列举了类型特性检测、成员变量/函数检测等典型应用场景。通过具体示例代码展示了std::void_t在检测类型别名、成员变量、成员函数和智能指针等方面的实际应用。std::void_t虽在C++17标准化,但其思想早被实践,是SFINAE和模板特化的重要工具,值
2026-01-01 09:41:22
548
原创 并行编程实战——CUDA编程的统一内存
本文介绍了CUDA中的统一内存(Unified Memory)技术。统一内存通过提供CPU和GPU共享的内存空间,简化了内存管理,减少了数据复制操作,提高了性能。文章分析了统一内存的特点、分配方式(系统API和CUDA托管内存API)以及应用方法(如数据预取和warp优化)。同时指出统一内存的使用需要考虑硬件和系统支持,不同平台可能存在差异。最后通过代码示例展示了统一内存的实际应用,强调开发者需根据环境选择合适的实现方式。统一内存作为持续演进的技术,需要开发者关注其在不同平台上的细节差异。
2025-12-28 10:08:37
750
2
原创 并行编程的突破
2025年技术成长回顾:重点突破并行编程领域,系统掌握TBB、CUDA等技术体系,解决实际开发中的驱动安装、版本冲突等问题。通过博客分享技术实践,将CUDA项目成功迁移至OneAPI+SYCL架构,实现CPU/GPU协同计算。认识到并行编程本质是算法与硬件资源的高效映射,不同技术各有优势。展望2026年将继续深入学习,与技术同行共同进步。
2025-12-27 22:57:47
229
原创 C++编程实践——模板的显式实例化
本文介绍了C++模板中的显式实例化概念及其应用。显式实例化是开发者手动为模板指定具体类型的实现方式,区别于隐式实例化和全特化。文章通过代码示例展示了显式实例化的语法特征,并分析了其与全特化的关键区别:显式实例化不需要重新实现模板代码。此外,文章阐述了显式实例化的优势,包括减少代码膨胀、提高链接效率等,并指出其必须定义在.cpp文件中以避免重复定义。最后,文章列举了显式实例化的典型应用场景,如库开发、类型控制和代码优化,并通过实例代码演示了编译后的具体实现形式。作者强调模板学习需要理论与实践相结合,随着C++
2025-12-24 12:18:29
916
3
原创 跟我学C++中级篇—Linux内核中链表分析
摘要:本文对比分析了传统链表与Linux内核中链表的实现差异。传统链表将数据包含在节点内,而内核采用"侵入式链表"设计,使链表节点嵌入到数据结构中,实现数据结构与数据的解耦。内核链表具有O(1)时间复杂度、缓存友好等优势,并通过container_of宏处理指针关系,支持同一数据对象在多个链表中使用。文中详细解析了LIST_HEAD_INIT等核心宏定义及container_of的工作原理,展现了内核链表在通用性和灵活性上的独特设计。
2025-12-23 12:40:54
884
1
原创 C++编程实践—多线程崩溃的一种问题分析
多线程程序偶发崩溃是开发中的常见难题,文章分析了五种主要原因:内存异常、并发竞态、边界问题、编译器优化和线程控制不当。特别指出"增加日志打印后崩溃消失"的现象,可能是日志破坏了原有执行时序、内存布局或编译器优化所致。定位方法包括分析core文件、简化调试模型、增加同步和使用检测工具。解决方案建议合理使用锁、拆分同步逻辑或依靠经验处理。文章强调解决多线程问题需要持续积累方法论和实践经验,透过现象抓住本质才能有效应对这类复杂问题。
2025-12-22 12:24:46
603
原创 并行编程实战——CUDA编程的内核循环展开
本文介绍了循环展开优化技术在CPU和CUDA编程中的应用。循环展开通过减少循环次数、增加单次循环的计算量来提高性能,但需要注意分支惩罚和寄存器占用问题。文章展示了手动和自动(编译器优化)两种循环展开方式,并提供了CUDA中的具体实现示例,包括使用#pragma unroll指令。最后强调优化技术需要灵活应用,避免教条主义。核心思想是不同语言/平台的技术本质相通,只是实现方式各有特点。
2025-12-21 10:08:35
412
1
原创 C++23中的模块应用说明之一基础分析
C++20模块机制解析:摆脱头文件困境的新范式 本文分析了C++20引入的模块机制,旨在解决传统头文件带来的编译污染、命名冲突等问题。模块通过export显式控制接口导出,提供更安全的代码组织方式。文章详细介绍了模块应用的五个方面:接口与实现分离、export规则限制、文件命名规范、全局模块片段(兼容传统头文件)和私有模块片段的使用方法,并提供了具体示例代码。与Go、Java等语言的包管理机制类似,C++模块通过显式接口导出和严格作用域控制,实现了更高效的编译管理和更清晰的代码组织。作者建议开发者参考其他语
2025-12-20 09:26:15
646
原创 C++编程实践——多线程变量共享问题展开分析
本文探讨了C++多线程编程中的常见问题及解决方案。文章首先描述了多线程环境下偶发的数据异常和崩溃问题,分析了四种潜在原因:竞态条件、缓存读写问题、指令乱序和原子操作破坏性。针对问题定位,提出了内存屏障、日志记录和编译器优化控制等方法。解决方案包括使用锁机制、原子变量、volatile关键字等技术手段。最后强调这类问题看似简单实则复杂,需要开发者全面掌握相关知识才能有效解决。全文通过生动的比喻揭示了多线程问题的隐蔽性和复杂性。
2025-12-19 08:00:05
525
原创 跟我学C++中级篇——std::is_invocable的分析应
本文介绍了C++17标准中的std::is_invocable系列接口,用于在编译时检查函数调用的安全性。文章首先阐述了该特性的背景和重要性,指出它能有效防范模板编程中的运行时错误。随后详细解析了其定义和实现原理,包括四种主要接口(基础调用检查、返回值检查及对应的异常安全版本)及其辅助函数。技术分析部分揭示了这些接口仍基于SFINAE技术,通过decltype和declval实现参数和返回类型检测。文章还列举了该特性的主要应用场景(模板元编程、函数签名检查等)和使用限制,最后通过示例代码演示了如何检查成员函
2025-12-18 12:18:21
749
原创 C++编程实践——可变参数模板分析
本文探讨了C++可变参数模板的必要性及其在分布式系统中的应用挑战。随着跨进程通信需求增长,传统强类型语言面临运行时参数不确定性的问题。文章分析了变参模板如何通过编译期类型检查、完美转发等机制保证类型安全,并介绍了C++11到C++26标准对参数包处理的改进。针对分布式场景,提出四种解决方案:开发者自定义、显式封装逻辑、模板元编程及反射技术,强调应根据实际需求选择合适方法。最后指出理解技术演进背景的重要性,避免在实践过程中重复前人的弯路。
2025-12-17 15:34:39
285
原创 c++20容器中的透明哈希
C++标准从14到20逐步引入透明机制,先有透明操作符,后有透明哈希。透明操作符针对有序容器,通过支持异构数据操作避免临时对象创建;透明哈希则应用于无序容器,自定义哈希函数实现类似效果。透明机制的核心是定义is_transparent标识符,并提供支持多类型的操作符重载。通过透明哈希器(如支持string、string_view和const char*的统一哈希计算)和透明比较器(利用C++14的std::equal_to<>),C++20实现了高效的无序容器查找,消除了临时对象开销。这种渐进式
2025-12-16 12:02:16
563
原创 计算机原理——超线程技术
本文介绍了Intel的超线程技术(HT)原理及应用。HT通过虚拟化将一个物理CPU核心模拟为多个逻辑核心,共享执行单元但独立寄存器,从而提高并行性。该技术需CPU、主板、BIOS和操作系统共同支持,2002年首次应用于Xeon处理器。与Superscalar技术的指令级并行不同,HT实现的是CPU级别的并行。HT适合I/O密集型、内存压力小或CPU空闲多的工作场景,但对开发者而言通常无需特别处理。目前HT已广泛普及,多数情况下默认开启,仅在特定高性能计算场景可能需要调整。
2025-12-15 14:10:24
567
1
原创 跟我学C++中级篇——循环展开的分析
本文探讨了循环展开(loop unrolling)这一编译器优化技术。循环展开通过减少条件分支和流水线停顿来提升性能,适用于迭代次数少且计算量大的短循环。文章介绍了手动和自动两种展开方式,分析了其性能提升原理(减少指令跳转、提高缓存命中率),同时也指出了过度展开可能导致代码膨胀、寄存器耗尽等缺点。最后介绍了模板元编程、常量表达式等高级展开方法,并建议在现代开发中优先考虑编译器优化和SIMD并行技术。循环展开需要根据实际情况谨慎使用,通过性能测试验证优化效果。
2025-12-14 09:53:05
551
原创 C++23中的自定义模块开发
本文介绍了C++23模块开发的实际应用。首先演示了自定义模块的编写方法,包括模块声明、导出函数和类,并通过命令行编译验证了模块功能。接着探讨了模块文件命名规则问题,指出需要遵循特定扩展名要求。随后展示了使用CMake构建模块化项目的配置过程,比较了不同CMake版本对模块支持的区别。最后强调了对新技术应循序渐进的学习态度,指出模块化编程尚未大规模普及,开发者有充足时间逐步掌握。文章通过实践案例展示了C++模块化开发从编码到构建的完整流程。
2025-12-13 10:20:10
457
原创 并行编程实战—CUDA、OpenCL、SYCL和ROCm的介绍
本文概述了并行编程技术的发展现状与趋势。随着AI大模型和大数据处理的兴起,并行技术从软件库逐步向硬件层面延伸,GPU并行成为主流,主要分为NVIDIA的CUDA和AMD的ROCm两大阵营。文章分析了硬件厂商与开源阵营的竞争格局,介绍了OpenCL等并行标准,并探讨了C++扩展与SYCL两种编程模型的技术路线之争。特别指出AI发展对并行技术的强依赖,使GPU需求激增,CUDA生态形成护城河。全文旨在帮助初学者理清并行技术领域的核心概念和发展脉络,避免陷入单一技术视角或选择困惑。
2025-12-12 08:37:40
790
原创 C++编程实践——条件变量中wait和std::unique_lock关系
本文探讨了条件变量中必须使用std::unique_lock而非std::lock_guard的原因。通过分析条件变量wait的源码实现,指出std::unique_lock能提供灵活的锁管理机制,包括锁的释放和重新获取,这是处理假唤醒和信号丢失问题的关键。相比之下,std::lock_guard仅提供简单的RAII封装,无法满足条件变量对锁操作的精细控制需求。文章强调std::unique_lock以少量性能代价换取更高的灵活性,是多线程编程中与条件变量配合的理想选择,特别是在生产者-消费者等复杂场景下能
2025-12-11 12:09:57
577
原创 计算机原理——进程的本质
本文从操作系统角度重新审视进程的概念与本质。文章首先区分了程序(静态文件)与进程(动态运行实体),并类比工人工作方式解释了线程与协程的区别。进程作为资源分配和独立运行的基本单位,其本质是PCB(进程控制块)+程序段+数据结构的组合,操作系统通过PCB表管理进程状态、资源和调度。文中以Linux为例,剖析了进程创建过程(fork-exec机制),强调深入理解进程对掌握线程开发的重要性。最后指出,只有从底层把握进程本质,才能在开发实践中灵活运用并发编程技术。
2025-12-10 13:43:08
872
原创 计算机原理——Superscalar技术
摘要:超标量(Superscalar)技术是一种CPU微架构设计,通过单周期并行发射执行多条独立指令提高吞吐量。其核心原理包括多发射、乱序执行、寄存器重命名和分支预测等技术。主要优势是提高指令执行效率和硬件利用率,但对软件透明。局限性包括指令依赖、资源竞争和硬件复杂性等问题。应用上可通过优化代码结构、减少分支、内存对齐等方法提升性能。该技术已广泛应用于PC、服务器及嵌入式处理器。开发者需理解底层硬件原理,才能编写高效运行的代码。
2025-12-09 12:06:30
639
2
原创 跟我学C++高级篇—运行时反射的std::type_index
C++通过std::type_index、type_info和typeid提供了轻量级的反射支持。typeid运算符返回type_info对象描述类型信息,type_index则是对其封装以便标准容器使用。主要应用场景包括类型映射、工厂模式、类型擦除等,但需注意哈希冲突、跨平台兼容性和异常处理等问题。示例展示了如何利用type_index构建类型管理系统。虽然C++的反射功能有限,但这些基础RTTI工具仍为开发者提供了类型操作的基本能力。随着标准演进,反射支持有望进一步完善。
2025-12-08 11:00:03
609
1
原创 并行编程实战——CUDA编程的分析调试
本文系统介绍了CUDA程序的调试与分析技术。首先阐述了代码调试的三大类型(本地/附加/远程调试)和三种方法(IDE/代码/工具分析),强调调试能力是开发者水平的重要体现。接着重点讲解了CUDA调试工具:代码级调试(分析接口、断言、错误机制)、IDE工具(Nsight系列、CUDA GDB、memcheck)及其应用示例,并演示了在VS2017中使用Nsight调试向量加法的具体流程。最后介绍了NVIDIA Compute Sanitizer等辅助工具。文章指出调试分析是CUDA开发的关键环节,后续将针对具体
2025-12-07 10:51:23
698
原创 并行编程实战——CUDA编程的混合编程
摘要:CUDA支持Driver API与Runtime API混合编程,结合二者的优势实现灵活开发。关键流程包括:先初始化Driver API,共享上下文,合理选择API启动内核。注意事项涵盖初始化顺序、上下文一致性、内存管理规范及错误处理机制。示例代码展示了混合调用的基本模式。混合编程虽能兼顾高效与便捷,但对开发者提出了更高要求,需熟练掌握两种API并妥善管理资源,开发成本与灵活性成正比。
2025-12-07 10:25:26
424
原创 C++23中的import使用CMake实践
本文介绍了在CMake中使用C++模块编程的两种方法。第一种使用g++需要预先编译标准库模块(g++ -std=c++23 -fmodules-ts -fsearch-include-path -c bits/std.cc),然后在CMakeLists.txt中配置相关参数。第二种使用Clang可直接通过CMake配置(需设置CMAKE_EXPERIMENTAL_CXX_IMPORT_STD等参数),但需要安装libc++-dev库。实验表明,当前Clang+CMake的方案更便捷,而g++方案需要额外步骤
2025-12-06 08:09:29
323
原创 跟我学C++高级篇—从emplace_back到移动语义
C++11引入的std::emplace_back通过原地构造、完美转发和移动语义三大技术点,有效减少了容器插入操作中的拷贝开销。相比push_back,它直接在容器内存位置构造对象,避免了临时对象的创建和拷贝,特别适用于构造成本高或高频操作的场景。使用时需注意容器扩容、参数传递方式(推荐直接传构造参数而非对象)、异常控制等问题。该技术适用于资源池、性能敏感系统等场景,能显著提升效率,但也要注意避免滥用,需根据对象特性合理选择插入方式。通过预分配内存等配套措施,可以进一步发挥其性能优势。
2025-12-05 07:47:11
846
2
原创 C++编程实践——标准库中容器存储目标分析
本文探讨了C++容器存储对象与指针的选择问题。分析表明,对于简单小型对象推荐直接存储,可保证生命周期管理简单;对于大型对象、多态需求或共享场景,建议使用智能指针存储以确保内存安全。文中提出六条处理原则:1)小对象优先存储值;2)大对象使用智能指针;3)多态需求必须用指针;4)支持移动语义可考虑值存储;5)含指针成员需处理深拷贝;6)共享数据推荐智能指针。通过示例代码展示了使用shared_ptr实现内存缓存的实践方案,体现了资源安全管理的工程化实现。
2025-12-04 15:01:46
1078
原创 跟我学C++中级篇——Linux系统信号分析
本文介绍了Linux系统中的信号机制。信号是一种异步通知机制,用于告知进程特定事件的发生。文章分析了信号的分类(可靠/不可靠信号、普通/实时信号)、产生方式(IO、系统调用、软硬件产生)以及运行机制(信号抵达、未决、阻塞等状态)。信号处理包括默认处理、自定义处理和忽略三种方式,具有异步性、简单性、不可靠性等特点。文章强调理解信号机制对Linux开发的重要性,建议开发者根据实际需求选择合适的信号处理方式。
2025-12-03 14:07:31
266
1
原创 C++编程实践——signalfd
本文介绍了Linux系统中的信号文件句柄(signalfd)机制,该机制将传统异步信号处理转换为同步文件I/O操作。通过分析内核数据结构signalfd_ctx和signalfd_siginfo,阐述了信号如何被封装为文件描述符,并与事件循环机制集成。文章详细说明了signalfd的工作原理,包括信号发送、内核处理和应用层读取的完整流程。同时总结了signalfd的优点(同步化处理、避免竞态条件、线程安全等)和局限性(Linux特有、信号可能丢失等),并提供了结合epoll的示例代码。该机制特别适用于需要统
2025-12-02 12:28:31
541
1
朗新WEBSERVER接口(南网和天津电网)
2009-03-16
大数阶乘算法的一个例子
2018-10-06
AndroidStudio使用NDK生成静态库的方法?
2015-08-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅