C++26模块支持进展曝光(GCC编译器内幕首次公开)

DIY天文摄影:如何用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜(附详细步骤) 本文为天文摄影爱好者提供了一份详尽的DIY指南,介绍如何使用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜,将其改造为高灵敏度单色相机。文章深入剖析了NMP溶剂的作用原理与关键风险,并系统性地拆解了从材料准备、分步操作到后期验证的完整实践流程,旨在帮助具备动手能力的爱好者实现深空天体摄影的进阶目标。 阅读详情

第一章:C++26模块化演进的背景与意义

C++语言自诞生以来,始终在应对大型项目开发中日益增长的复杂性挑战。传统头文件机制虽简单直接,却带来了编译依赖冗余、构建时间过长以及命名冲突等长期痛点。C++20首次引入模块(Modules)作为核心特性,标志着从文本包含向语义化单元的范式转变。而C++26将进一步深化这一演进,推动模块系统走向成熟与标准化。

模块化解决的核心问题

  • 消除宏和头文件的重复解析,显著提升编译效率
  • 实现接口与实现的真正分离,增强封装性
  • 支持跨平台模块二进制分发,减少重复编译成本

标准演进中的关键改进

C++标准版本模块相关特性
C++20基础模块语法,import/export关键字支持
C++23模块接口单元优化,支持导出模板
C++26(草案)模块链接模型统一、跨翻译单元可见性控制增强

典型模块使用示例

// math_lib.ixx - 模块接口文件
export module math_lib;

export int add(int a, int b) {
    return a + b; // 导出加法函数
}

export double pi() {
    return 3.14159; // 导出常量访问函数
}
上述代码定义了一个名为math_lib的模块,通过export关键字明确声明对外暴露的API。其他翻译单元可通过import math_lib;直接使用其功能,无需预处理器介入,避免了传统#include带来的重复解析开销。
graph LR A[源文件 main.cpp] --> B{import math_lib} B --> C[编译器加载预构建模块] C --> D[直接引用符号 add/pi] D --> E[生成目标代码]

第二章:GCC对C++26模块的核心支持机制

2.1 模块接口与实现的编译模型解析

在现代软件构建体系中,模块化设计通过分离接口与实现提升代码可维护性。编译阶段,接口文件(如 `.h` 或 `interface.go`)被导入以验证调用合法性,而具体实现则在链接时绑定。
接口与实现的分离机制
以 Go 语言为例,接口定义与实现无需显式声明关联,编译器通过结构体是否满足方法集自动判定:
type Reader interface {
    Read(p []byte) (n int, err error)
}

type FileReader struct{} 
func (f FileReader) Read(p []byte) (int, error) {
    // 实现读取逻辑
    return len(p), nil
}
上述代码中,FileReader 隐式实现 Reader 接口,编译器在类型检查阶段完成匹配。
编译流程中的依赖处理
  • 接口定义独立编译,生成符号表供引用方校验
  • 实现模块单独编译为目标文件
  • 链接阶段解析实际函数地址,完成静态或动态绑定

2.2 模块单元的生成与二进制契约(Module Interface Units)

在现代C++模块系统中,模块接口单元(Module Interface Unit)是定义可导出接口的核心组件。它通过export module声明对外暴露的符号,编译后生成模块接口文件(如.ifc),形成稳定的二进制契约。
基本语法结构
export module MathLib;

export namespace math {
    int add(int a, int b);
}
上述代码定义了一个名为MathLib的模块,其中export关键字标识了可被其他模块导入的接口。函数add被显式导出,调用方可通过import MathLib;使用该功能。
模块的优势与机制
  • 避免头文件重复包含,提升编译效率
  • 接口与实现分离,增强封装性
  • 二进制接口文件支持跨项目共享,减少依赖重建
编译器将模块接口编译为平台相关的.ifc文件,这些文件包含符号元数据和类型信息,构成模块间的二进制契约,确保链接时语义一致性。

2.3 模块依赖管理与编译时性能优化

依赖解析与构建效率
现代构建系统通过精确的模块依赖分析,避免重复编译未变更代码。以 Bazel 为例,其采用增量构建机制,仅重新编译受变更影响的模块。
def go_library(name, srcs, deps=[]):
    # 定义Go库及其依赖项
    # deps 中声明的模块将被静态分析并纳入依赖图
    library(name = name, srcs = srcs, deps = deps)
上述规则定义了模块的输入边界,构建系统据此生成有向无环图(DAG),实现精准的依赖追踪与缓存复用。
编译缓存与并行优化
利用远程缓存和并行编译策略可显著提升大规模项目构建速度。构建系统根据依赖拓扑自动调度任务:
优化策略作用
增量编译仅重建变更模块
远程缓存复用历史构建产物

2.4 模块名称解析和链接语义的实现细节

模块名称解析是构建系统中关键的一环,其核心任务是将模块引用(如相对路径或包名)转换为可定位的模块实体。该过程通常依赖于配置的模块解析规则和文件系统扫描。
解析流程与策略
解析器首先根据导入语句中的字符串判断类型:相对导入(./utils)基于当前模块路径计算;绝对导入则通过根目录或node_modules查找。解析策略支持别名(alias)和扩展名补全。

// webpack.config.js 片段
resolve: {
  alias: {
    '@components': path.resolve(__dirname, 'src/components')
  },
  extensions: ['.js', '.ts', '.jsx']
}
上述配置允许使用@components/Button指向特定路径,并自动匹配文件后缀。
链接语义的建立
解析成功后,构建工具在模块间建立依赖链接,形成有向图结构。每个模块节点包含其导出符号表,链接过程需确保符号引用与定义一致。
阶段操作
解析将模块标识符映射到物理路径
加载读取模块源码并进行语法分析
链接绑定导入与导出的符号引用

2.5 实践:在GCC中构建首个C++26模块程序

启用模块支持
GCC从13版本开始实验性支持C++26模块。需使用 -fmodules-ts 编译选项以启用模块功能。
模块定义与导入
export module math_utils;
export int add(int a, int b) {
    return a + b;
}
上述代码定义了一个导出函数 add 的模块 math_utils。关键字 export 表示该实体对导入者可见。
import math_utils;
#include <iostream>

int main() {
    std::cout << add(3, 4) << '\n';
    return 0;
}
通过 import 直接引入模块,避免头文件重复解析,提升编译效率。
编译流程
  1. 先编译模块接口单元:g++ -fmodules-ts -c math_utils.cpp -o math_utils.o
  2. 再编译主程序并链接:g++ -fmodules-ts main.cpp math_utils.o -o main

第三章:模块化带来的语言特性变革

3.1 隐式模块链接与显式导入控制

在现代构建系统中,模块间的依赖管理逐渐从隐式链接转向显式导入控制,以提升可维护性与构建确定性。
显式导入的优势
  • 明确依赖边界,避免命名冲突
  • 支持细粒度的符号控制
  • 增强构建缓存的可预测性
代码示例:显式模块声明

module myapp
require (
    github.com/pkg/queue v1.2.1
    golang.org/x/text v0.3.7
)
exclude github.com/bad/lib v1.0.0
该配置通过 require 显式声明依赖版本,exclude 排除不安全版本,确保依赖图的精确控制。
隐式与显式的对比
特性隐式链接显式导入
依赖发现自动扫描手动声明
版本控制松散严格锁定

3.2 模块对宏和预处理器的影响分析

现代编程语言中的模块系统逐渐削弱了传统宏和预处理器的使用场景。随着编译器对模块的原生支持,诸如头文件包含、条件编译等原本依赖预处理器完成的任务,现可通过模块化机制更安全地实现。
宏定义的替代路径
以 C++20 为例,模块可直接封装接口,避免宏污染全局命名空间:
module MathUtils;
export int add(int a, int b) { return a + b; }
上述代码通过 module 和 export 导出函数,无需使用 #define ADD(a,b) ((a)+(b)) 这类易出错的宏。
预处理指令的弱化
  • 模块编译一次,多次导入,提升构建效率
  • 消除 #include 带来的重复解析开销
  • 减少 #ifdef 等条件编译的使用频率
模块机制从根本上改变了代码组织方式,使预处理器逐步退居次要地位。

3.3 实践:重构传统头文件项目为模块化架构

在大型C++项目中,传统头文件包含方式常导致编译依赖复杂、构建速度缓慢。通过引入模块(Modules),可有效解耦组件间的物理依赖。
迁移步骤概览
  • 识别独立功能单元,如数学工具、日志系统
  • 将头文件内容转换为模块接口单元
  • 使用 import 替代 #include
模块定义示例
export module logger;

export void log_info(const std::string& msg);
void log_debug(const std::string& msg); // 不导出
该模块仅导出 log_info,封装内部实现细节,提升信息隐藏能力。
性能对比
架构类型编译时间(秒)依赖冗余度
头文件86高
模块化34低

第四章:编译器内部实现与开发体验优化

4.1 模块持久化存储(PCM)的设计与布局

存储架构设计
模块持久化存储(PCM)采用分层结构,将元数据、状态快照与操作日志分离存储,提升读写效率与恢复能力。核心组件包括持久化引擎、同步控制器和校验模块。
关键配置示例
{
  "storage": {
    "backend": "pcm",          // 存储后端类型
    "dataPath": "/var/lib/pcm", // 数据存储路径
    "syncInterval": 5000       // 同步间隔(毫秒)
  }
}
该配置定义了PCM的运行参数:backend指定使用PCM作为持久化方案;dataPath确保数据集中管理;syncInterval控制内存状态向磁盘写入的频率,平衡性能与一致性。
数据同步机制
  • 写入时生成版本化快照,支持多版本并发控制(MVCC)
  • 异步刷盘策略减少I/O阻塞
  • 基于WAL(预写日志)保障故障恢复完整性

4.2 并行编译与模块构建效率实测

在大型项目中,并行编译显著影响构建速度。通过启用多线程任务调度,可充分利用现代CPU的多核能力。
构建工具配置示例

# 启用8线程并行编译
make -j8 CC=gcc CXX=g++
该命令中的 -j8 表示同时运行最多8个作业,能有效减少构建时间。线程数应根据物理核心数调整,过高可能导致资源争用。
性能对比数据
线程数构建时间(秒)CPU利用率
121735%
84982%
结果显示,并行度提升带来近4.4倍加速比。模块化设计进一步降低耦合,使增量构建更高效。

4.3 调试信息生成与IDE集成挑战

在现代编译流程中,调试信息的生成是连接源码与运行时行为的关键环节。编译器需将高级语言结构映射为可被调试器识别的元数据,通常遵循 DWARF 或 PDB 格式标准。
调试信息嵌入示例
int main() {
    int x = 42;          // DW_TAG_variable + DW_AT_name="x"
    return x * 2;
}
上述代码经编译后,会生成对应的 DWARF 调试条目,描述变量 x 的类型、作用域和位置(寄存器或栈偏移),供 GDB 等工具解析。
IDE集成常见问题
  • 调试符号路径不匹配导致断点无法命中
  • 增量构建时 PCH 文件破坏调试信息一致性
  • 跨平台交叉编译中目标架构与 IDE 预期不符
典型工具链兼容性对照
编译器调试格式主流IDE支持度
ClangDWARF高(VS Code, Xcode)
MSVCPDB高(Visual Studio)

4.4 实践:使用GDB调试C++26模块化程序

随着C++26引入原生模块(Modules),传统基于头文件的调试方式面临挑战。GDB在13.1版本后增强了对C++模块符号的解析能力,使开发者能够直接调试模块接口单元。
编译与调试准备
启用模块支持需使用最新GCC或Clang,并生成调试信息:
g++ -fmodules-ts -g -c math_core.cppm
g++ -fmodules-ts -g main.cpp math_core.o -o app
参数说明:`-fmodules-ts` 启用实验性模块支持,`-g` 生成调试符号,确保GDB可读取模块内函数名与变量。
在GDB中定位模块函数
启动调试后,可通过模块限定符定位函数:
gdb ./app
(gdb) break math_core::calculate_sum
GDB能正确识别 `math_core` 模块中的 `calculate_sum` 函数并设置断点。
查看模块作用域变量
使用 `info variables` 可列出模块导出的全局符号:
  • math_core::total_count:统计调用次数
  • math_core::threshold:运行阈值配置

第五章:未来展望与生态影响

可持续架构设计的演进
现代系统设计正逐步向低功耗、高效率方向演进。以边缘计算为例,设备在本地完成数据处理,显著降低中心服务器负载。某智慧城市项目通过部署轻量级推理模型于前端摄像头,将云端通信频次减少60%。
  • 采用异构计算资源动态调度策略
  • 利用AI预测负载变化,提前调整实例规模
  • 使用WASM模块替代部分微服务,提升执行效率
绿色数据中心实践案例
Google已实现全年100%可再生能源供电,其比利时数据中心甚至在无制冷系统下稳定运行。关键在于:

// 示例:基于温度感知的任务调度算法片段
if ambientTemp > threshold {
    migrateTaskToCoolerZone()
    reduceClockSpeed()
}
该逻辑嵌入到集群管理器中,实时监控机柜温度并动态迁移工作负载。
开源社区推动标准统一
Linux基金会旗下Carbon Aware Computing项目提供SDK,帮助开发者构建碳感知应用。以下为典型集成方式:
组件作用部署位置
Carbon Intensity API获取区域电网碳排放强度云网关
Scheduler Plugin选择低碳时段执行批处理任务Kubernetes Control Plane
企业级实施路径
流程图:需求评估 → 碳基线测量 → 架构优化 → 持续监控 → 合规报告 工具链集成Jenkins插件,在CI/CD流水线中加入能耗评分机制,低于阈值则阻断部署。
【100%通过率】华为od机试C卷【部门人力分配】Python 实现 当前部门需要完成 N 个需求,需求用 requirements[i] 表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。2:明显这个人力需求值有上下限的情况下【下限为requirements中的最大值,上限为requirements中的最大两个值相加(因为最多有两个需求同一个月开发)】,可以考虑使用二分法。当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。 阅读详情

相关推荐

FPGA数字下变频实战:用Vivado DDS IP核实现IQ采样与频率校正(附MATLAB仿真对比)

本文提供了一份基于Vivado DDS IP核实现FPGA数字下变频(DDC)的完整工程指南。详细阐述了IQ采样的原理、DDC链路构建、DDS频率校正的工程实现,并重点介绍了如何利用MATLAB搭建黄金参考模型进行全链路仿真与对比验证,分享了关键的调试技巧与性能优化建议。

t1u2v的博客 810

C++26模块与GCC:如何将编译速度提升80%?真相在这里

掌握C++26模块的GCC用法,显著提升编译效率。适用于大型项目构建,通过模块化替代头文件包含,减少重复解析,实测编译速度提升达80%。了解如何在GCC中启用并优化C++26模块的GCC支持,值得收藏。

LogicGap的博客 1054

手把手教你学Simulink--基于故障诊断与容错控制的场景实例:电动汽车电机驱动系统的故障检测与隔离

本文介绍了基于Simulink的电动汽车电机驱动系统故障诊断与隔离(FDI)仿真建模方法。通过构建永磁同步电机(PMSM)驱动系统模型,实现了IGBT开路、电流传感器漂移等典型故障的注入与检测。重点阐述了基于观测器的残差生成方法,以及利用Stateflow实现的故障隔离逻辑。仿真结果表明,该系统能在85ms内准确识别故障类型,隔离准确率达97%,并支持容错控制。文章还探讨了AI故障预测、数字孪生等高级应用方向,为电动汽车电驱系统安全提供了完整的仿真解决方案。

MHD0815的博客 961

C++未来已来(Clang 17全面支持C++26新特性曝光)

掌握C++26新特性,从Clang 17 C++26 特性测试开始。本文详解编译器支持现状、实验性功能启用方法及实际应用场景,助开发者提前体验协程改进、模式匹配等前沿特性,提升代码效率与可读性,值得收藏。

StepLens的博客 931

【机电杂谈2】BLDC和PMSM的特点和区别

在日常生活中,小到电动玩具,大到电动汽车,永磁电机的身影可以说是无处不在。有刷直流电机、无刷直流电机、永磁同步电机由于其结构和输出特定的不同也被应用到不同的场合。如果你经常拆一些玩具和家电,就会看到大量的有刷直流电机和无刷直流电机,而永磁同步电机主要应用在高精度的工业伺服和电动汽车领域。本文就从电机的结构和控制方面,对这几种常见的永磁电机做简单的梳理和归纳。

2936

别再找在线API了!用C#调用微信电脑版自带的OCR,本地识别又快又准

本文详细介绍了如何利用C#调用微信电脑版内置的OCR引擎实现本地文字识别,解决传统云端API的隐私和网络依赖问题。微信OCR具备高精度中文识别、完全离线运行和零成本接入三大优势,特别适合企业文档电子化处理。通过实战代码演示了核心交互逻辑、批量处理流水线和表格数据提取等高级应用场景。

weixin_29295541的博客 589

GCC 14 C++26并发支持全曝光(下一代并发编程利器)

掌握高效并发编程新范式,GCC 14 C++26 并发支持带来标准化协程与改进的原子操作。适用于高并发服务器、实时系统等场景,提升性能与开发效率,下一代C++并发利器已就位,值得收藏。

InitPulse的博客 794

基于价值的深度强化学习:DQN

本文主要是介绍DQN原理和算法伪代码和代码实现,算法实现包括pytorch版本和stable-baselines3版本

溯源的专栏 1085

为什么顶尖团队都在关注C++26的constexpr容器?(深度技术内幕曝光)

掌握编译期性能优化新范式!通过2025全球C++及系统软件技术大会:constexpr容器在C++26中的工程化落地,揭示高性能计算与嵌入式场景下的零成本抽象实现方法,提升构建时计算效率。关键特性支持让代码更安全高效,值得收藏

CompiShoal的博客 1142

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1048

Synopsys逻辑工艺库(DC综合)

逻辑库包括仅与综合过程有关的信息且通过DC用于设计的综合和优化。这一信息包括引脚到引脚的时序、面积、引脚类型和功耗以及其他DC需要的必须数据。逻辑库是一个文本(通常扩展名".lib"),通过使用Library Compiler(LC)编译生成带有扩展名名".db"的二进制文件。以SMIC的逻辑综合库为例:库文件下载地址。

baidu_34971492的博客 2424

VSCode + C++26模块化测试配置全解析(业界领先实践曝光)

掌握VSCode C++26模块化的测试配置,解决现代C++项目测试难题。适用于大型模块化工程,结合CMake与Google Test实现自动化单元测试,提升代码质量与开发效率。配置清晰、扩展性强,值得收藏。

LogicGap的博客 1008

保姆级教程:ABAP 通过 HTTP POST 调用 OData 服务创建业务数据的具体例子

笔者之前的文章发布之后,有朋友在评论区留言,询问 ABAP 除了 Web Service 之外,是否也支持 HTTP 呢?ABAP 这么强大的语言,支持 HTTP 当然不在话下。网上有很多在 ABAP 系统基于 CL_HTTP_CLIENT 工具类,通过 HTTP 协议和第三方系统交互的代码例子。本文介绍笔者项目中一个实际例子,实现的是在 ABAP 系统 A 通过 HTTP 调用 OData 服务,在 ABAP 系统 B 创建业务数据的需求。下面我们按照这个套路来一步步实现。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 700

2025全球C++技术大会精华(C++26 Adoption路线图首曝光)

掌握C++26演进难题?2025全球C++及系统软件技术大会:C++26特性的渐进式adoption方案首度公开,涵盖工业级适用场景、分阶段迁移策略与兼容性保障方法,助力团队平滑升级。技术前瞻性强,值得收藏。

LogicShoal的博客 802

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【C++26并发革命来临】:基于GCC 14的首批实验性功能实测数据曝光

揭秘GCC 14对C++26并发特性测试的最新支持进展,提升多线程开发效率。实测涵盖协作中断、异步任务库等新特性,适用于高性能计算与并发编程场景,显著优化代码可读性与执行性能。前沿技术抢先掌握,值得收藏。

CodeIsle的博客 1036

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++26模块使用陷阱曝光:90%开发者都会犯的4个错误

掌握C++26模块的正确用法,避开常见陷阱。本文结合C++26模块的示例,解析导入导出错误、模块分区 misuse 等4大高频问题,适用于大型项目构建与编译优化场景,提升代码封装性与编译效率,值得收藏。

AlgoInk的博客 757

C++26内存安全重大突破(2025大会核心成果曝光)

解决C++并发编程内存安全隐患,2025全球C++及系统软件技术大会:C++26内存模型增强并发安全的工业实践展示最新成果。聚焦C++26新内存模型在高并发、实时系统的应用,通过统一内存屏障与原子操作优化,提升安全性与性能。工业级案例验证实效,值得收藏。

ByteVein的博客 1102

C++26模块化在VSCode中的兼容性挑战(专家级解决方案曝光)

解决VSCode C++26模块化兼容性难题,提供专家级配置方案。涵盖CMake集成、clangd配置与模块接口文件支持,适用于现代C++项目开发。显著提升编译效率与代码管理能力,值得收藏。

ByteChat的博客 641

C++26混合编译陷阱曝光:90%开发者忽略的5个关键细节

掌握C++26与传统头文件混合编译方案,解决新旧代码兼容难题。适用于大型项目渐进式升级,通过模块化隔离、显式导出控制和头文件包装实现平稳过渡。揭示5个易忽略的关键细节,提升编译效率与稳定性,值得收藏。

PixelStream的博客 922

C++标准化工作组内部流出文件曝光:异构内存模型设计细节首次公开

揭秘异构计算内存模型设计难题,2025全球C++及系统软件技术大会首次公开标准化方案,涵盖GPU/FPGA等场景的统一内存语义与跨架构一致性保障机制,提升性能可移植性。核心进展值得收藏。

FastSolve的博客 865

GCC 14重大更新曝光(仅限早期采用者):这些新功能将彻底改变你的构建流程

GCC 14特性支持全面升级,显著提升编译效率与代码优化能力。新增对C++23特性的完整支持,强化诊断警告和调试信息生成,适用于高性能计算与大型项目构建。开发者可利用新插件架构定制编译流程,加快迭代速度。早期采用者已验证其稳定性,值得收藏并点击了解详情。

CompiLume的博客 828

C++26反射元编程落地踩坑实录:从Clang 18 nightly到GCC 14.3,9类未文档化行为全曝光

本文直击C++26反射元编程落地难题,提供真实可用的实战案例,涵盖Clang 18 nightly与GCC 14.3双环境适配、9类未文档化行为规避策略及编译期类型遍历、成员枚举等核心方法。显著提升泛型库开发效率与可维护性,值得收藏。

IterLoom的博客 411

【C++26适配倒计时】:基于2025大会最新标准的企业迁移路线图曝光

掌握C++26合同编程企业级适配难题,2025全球C++及系统软件技术大会:C++26合同编程的企业级适配案例研讨深度解析金融、通信等高可靠场景迁移实践,涵盖渐进式重构策略与静态验证优化方案,提升系统稳定性与开发效率,值得收藏。

LogicGlow的博客 933

Clang 17+C++26组合调试陷阱曝光:90%工程师忽略的4个编译警告

掌握Clang 17 C++26特性调试技巧,避开常见编译陷阱。针对现代C++开发中的兼容性问题,解析4个高频警告成因与修复方案,提升代码稳定性与构建效率。适用大型项目迁移与新标准适配,值得收藏。

ProceChat的博客 273

C++工程师必须掌握的格式化技巧:2025大会未公开PPT精华抢先曝光

掌握高效日志输出与跨平台字符串处理难题?2025全球C++及系统软件技术大会:C++格式化库的工程化应用精华曝光,详解std::format在高性能服务中的实践方案、编译期检查技巧与性能优化策略,提升代码可维护性与运行效率,值得收藏。

PixelWander的博客 840

2025 C++性能调优前沿技术(系统级优化全曝光)

掌握现代C++性能调优核心方法,解决系统级软件瓶颈问题。2025全球C++及系统软件技术大会:现代C++的性能剖析实践深入解析编译优化、内存管理与并发性能提升,覆盖高频交易、引擎开发等关键场景。实战导向,洞见前沿技术趋势,值得收藏。

FuncInk的博客 661

C++26 contracts vs. static_assert vs. GSL:性能损耗实测数据曝光(纳秒级开销对比表)

C++26合约编程实战教程避坑指南:实测contracts、static_assert与GSL在函数入口、循环边界等典型场景的纳秒级开销,揭示编译期检查与运行时断言的性能权衡。涵盖启用策略、调试/发布模式差异及误用警示,助你零成本落地安全契约。值得收藏

AlgoFun的博客 359
上一篇: 揭秘Unreal引擎模块化机制:3步实现低耦合高内聚系统搭建
下一篇: 符号隔离性能损耗全解析(从字节码到运行时的4个关键节点)
SimTrans
博客等级 码龄1年 158粉丝 2004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值