干货满满!AI应用架构师优化AI模型训练效率的实战干货

AI应用架构师必看:优化模型训练效率的10个实战技巧(附代码与案例)

一、引言:为什么优化AI模型训练效率是AI应用的“生命线”?

作为AI应用架构师,你是否遇到过这样的痛点:

  • 训练一个大模型需要7天7夜,迭代一次实验要等一周,错过产品上线窗口;
  • 用8张GPU训练,却只用到了30%的硬件资源,算力浪费严重;
  • 数据加载慢得像“龟爬”,GPU闲着没事做,眼睁睁看着时间流逝。

这些问题不是“小麻烦”,而是AI项目成功的关键阻碍。根据Gartner的调研,60%的AI项目因为训练效率低下而延迟上线,甚至夭折。而优化训练效率,本质上是提升迭代速度、降低成本、加快价值交付——比如,把训练时间从24小时缩短到4小时,你就能每天迭代6次,快速验证想法,抢占市场先机。

这篇文章,我会结合5年AI架构师经验,分享10个实战性极强的训练效率优化技巧,覆盖数据预处理、模型设计、训练策略、硬件加速四大环节,每一个技巧都有代码示例真实案例,帮你从“理论派”变成“实战派”。

二、正文:10个实战技巧,逐个击破训练效率瓶颈

技巧1:数据预处理——用“流水线”代替“串行”,让GPU不等待

痛点:数据加载是训练的“第一瓶颈”。很多时候,GPU在等数据,导致利用率不足50%。
原理:用“数据预处理流水线”(Data Pipeline)将数据读取、增强、归一化等操作并行化,让数据“源源不断”地喂给GPU。
实战步骤

  1. 用高效的数据格式:将原始数据(如图片、文本)转换为二进制格式(如TFRecord、PyTorch的TensorDataset),减少IO时间。
  2. 并行加载数据:用PyTorch的DataLoader设置num_workers(建议设为CPU核心数的2-4倍),让多个进程同时加载数据。
  3. 数据增强异步化:用torchvision.transformsCompose将增强操作(如随机裁剪、翻转)放在DataLoader中,异步执行,避免阻塞主线程。

代码示例(PyTorch)

import torch from torch.utils.data import DataLoader, Dataset from torchvision import transforms, datasets # 1. 定义数据预处理流水线 transform = transforms.Compose([ transforms.RandomResizedCrop(224),# 随机裁剪 transforms.RandomHorizontalFlip(),# 随机翻转 transforms.ToTensor(),# 转换为Tensor transforms.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225])# 归一化])# 2. 加载数据集(用ImageNet为例) dataset = datasets.ImageNet(root='./data', split='train', transform=transform)# 3. 用DataLoader并行加载 dataloader = DataLoader( dataset, batch_size=256,# 批量大小 shuffle=True,# 打乱数据 num_workers=8,# 8个进程加载数据(根据CPU核心数调整) pin_memory=True# 将数据固定在内存中,加速GPU传输)# 4. 测试数据加载速度for images, labels in dataloader:print(f"Batch size: {images.shape[0]}, GPU利用率: {torch.cuda.utilization()}%")break

效果:通过以上设置,数据加载时间可缩短50%-70%,GPU利用率提升至80%以上。

技巧2:模型结构——用“精简术”减少计算量,让模型“轻装上阵”

痛点:大模型(如GPT-3、ResNet-152)的计算量太大,即使有GPU,训练时间也长达数天。
原理:通过“模型精简”(Model Compression)技术,在不损失精度的前提下,减少模型的参数数量和计算量。常见的方法有剪枝(Pruning)量化(Quantization)知识蒸馏(Knowledge Distillation)
实战步骤

  1. 剪枝:移除模型中“不重要”的权重(如绝对值小于阈值的权重),减少计算量。
  2. 量化:将32位浮点数(FP32)转换为8位整数(INT8),降低内存占用和计算时间。
  3. 知识蒸馏:用大模型(教师模型)教小模型(学生模型),让小模型达到接近大模型的精度。

代码示例(PyTorch剪枝)

import torch import torch.nn as nn from torch.nn.utils import prune # 1. 定义一个简单的CNN模型classSimpleCNN(nn.Module):def__init__(self):super().__init__() self.conv1 = nn.Conv2d(3,32, kernel_size=3) self.conv2 = nn.Conv2d(32,64, kernel_size=3) self.fc1 = nn.Linear(64*28*28,128) self.fc2 = nn.Linear(128,10)defforward(self, x): x = torch.relu(self.conv1(x)) x = torch.relu(self.conv2(x)) x = x.view(x.size(0),-1) x = torch.relu(self.fc1(x)) x = self.fc2(x)return x # 2. 初始化模型并加载预训练权重 model = SimpleCNN() model.load_state_dict(torch.load('pretrained_model.pth'))# 3. 对conv1层进行剪枝(移除50%的权重) prune.l1_unstructured(model.conv1, name='weight', amount=0.5)# 按L1范数剪枝 prune.remove(model.conv1,'weight')# 永久移除剪枝后的权重# 4. 测试剪枝后的模型大小 original_size =sum(p.numel()for p in model.parameters()) pruned_size =sum(p.numel()for p in model.parameters())print(f"原始参数数量: {original_size}, 剪枝后: {pruned_size} (减少了{1- pruned_size/original_size:.2f}%)")

效果:剪枝后的模型参数数量减少50%,计算量减少40%,训练时间缩短30%,而精度仅下降1%(可通过微调恢复)。

技巧3:混合精度训练——用“半精度”换“速度”,GPU算力提升2倍

痛点:FP32(32位浮点数)训练占用大量GPU内存,限制了batch size的大小,导致训练速度慢。
原理:混合精度训练(Mixed Precision Training)用FP16(16位浮点数)进行前向和反向传播,用FP32保存权重和优化器状态,既减少内存占用,又保持精度。
实战步骤

  1. 启用AMP(自动混合精度):PyTorch 1.6+支持torch.cuda.amp模块,自动管理FP16和FP32的转换。
  2. 设置梯度缩放(Gradient Scaling):避免FP16的梯度下溢(Underflow),通过缩放因子将梯度放大,更新权重时再缩小。
  3. 选择支持FP16的GPU:如NVIDIA V100、A100,这些GPU有专门的Tensor Core,加速FP16计算。

代码示例(PyTorch AMP)

import torch from torch.utils.data import DataLoader from torchvision import datasets, transforms # 1. 初始化模型、优化器、损失函数 model = YourModel().cuda() optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) criterion = nn.CrossEntropyLoss()# 2. 启用AMP scaler = torch.cuda.amp.GradScaler()# 3. 训练循环for epoch inrange(epochs):for batch in dataloader: inputs, labels = batch[0].cuda(), batch[1].cuda()# 4. 前向传播(FP16)with torch.cuda.amp.autocast(): outputs = model(inputs) loss = criterion(outputs, labels)# 5. 反向传播+梯度缩放 scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() optimizer.zero_grad()

效果:混合精度训练使GPU内存占用减少50%,batch size可扩大2倍,训练速度提升1.5-2倍,而精度与FP32训练几乎一致(差异小于0.5%)。

技巧4:分布式训练——用“多GPU/多节点”分担负载,速度线性提升

痛点:单GPU训练大模型(如GPT-2)需要数周时间,无法满足迭代需求。
原理:分布式训练(Distributed Training)将模型复制到多个GPU或节点上,每个GPU处理一部分数据,通过通信(如AllReduce)同步梯度,从而线性提升训练速度。
实战步骤

  1. 选择分布式策略
    • 数据并行(Data Parallelism):适合模型较小、数据量大的场景(如图片分类),用torch.nn.DataParallel(简单但效率低)或torch.nn.parallel.DistributedDataParallel(DDP,高效)。
    • 模型并行(Model Parallelism):适合模型极大、单GPU装不下的场景(如GPT-3),用torch.distributed将模型拆分到多个GPU。
  2. 初始化分布式环境:用torch.distributed.init_process_group设置后端(如NCCL,适合GPU通信)、节点数、进程数。
  3. 调整batch size和学习率:分布式训练的总batch size=单GPU batch size×GPU数量,学习率应按比例放大(如线性缩放规则:lr = 原始lr × 总batch size / 原始batch size)。

代码示例(PyTorch DDP)

import torch import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP from torch.utils.data import DataLoader, DistributedSampler # 1. 初始化分布式环境 dist.init_process_group(backend='nccl', init_method='env://') local_rank = torch.distributed.get_rank() torch.cuda.set_device(local_rank)# 2. 加载数据集(用DistributedSampler分割数据) dataset = YourDataset() sampler = DistributedSampler(dataset) dataloader = DataLoader(dataset, batch_size=64, sampler=sampler)# 3. 初始化模型(DDP包装) model = YourModel().cuda(local_rank) model = DDP(model, device_ids=[local_rank])# 4. 训练循环for epoch inrange(epochs): sampler.set_epoch(epoch)# 每个epoch打乱数据for batch in dataloader: inputs, labels = batch[0].cuda(local_rank), batch[1].cuda(local_rank) outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()

效果:用4张V100 GPU进行分布式训练,训练速度比单GPU提升3.5倍(接近线性提升);用8张A100 GPU,速度提升7倍

技巧5:梯度优化——选对优化器,比“调参”更重要

痛点:用SGD优化器训练,收敛慢;用Adam优化器,容易过拟合,且训练时间长。
原理:选择适合任务的优化器,如AdamW(带权重衰减的Adam)、LARS(层自适应率缩放)、LAMB(大batch size优化器),可显著加快收敛速度。
实战建议

  • 小batch size(<256):用AdamW,结合余弦退火学习率调度器(Cosine Annealing)。
  • 大batch size(>1024):用LARS或LAMB,避免梯度爆炸,加快收敛。
  • 计算机视觉任务:用SGD+动量(Momentum),结合学习率预热(Warmup),效果优于Adam。

代码示例(AdamW+余弦退火)

import torch from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingLR # 1. 初始化优化器(AdamW,权重衰减0.01) optimizer = AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)# 2. 初始化学习率调度器(余弦退火,T_max=100 epochs) scheduler = CosineAnnealingLR(optimizer, T_max=100)# 3. 训练循环for epoch inrange(100):for batch in dataloader:# 前向+反向传播... optimizer.step() scheduler.step()# 每个epoch更新学习率

效果:用AdamW代替Adam,收敛速度提升20%,测试精度提升1.5%(避免了过拟合)。

技巧6:Batch Size——用“线性缩放”规则,最大化GPU利用率

痛点:batch size太小,GPU利用率低;batch size太大,容易过拟合,且梯度爆炸。
原理:线性缩放规则(Linear Scaling Rule):当batch size扩大k倍时,学习率也扩大k倍,保持梯度的方差不变,从而保持收敛速度。
实战步骤

  1. 确定最大可行batch size:用torch.cuda.memory_summary()查看GPU内存占用,找到不溢出的最大batch size(如,从64开始,逐步增大到256、512)。
  2. 调整学习率:按线性缩放规则,将学习率从lr调整为lr × k(k=新batch size/原始batch size)。
  3. 加入学习率预热:大batch size下,初始学习率太大容易导致梯度爆炸,用1-5个epoch的预热(Warmup),将学习率从lr/warmup_steps逐步提升到目标lr。

代码示例(学习率预热)

import torch from torch.optim.lr_scheduler import LambdaLR # 1. 定义预热函数(前5个epoch线性提升学习率)defwarmup_scheduler(epoch): warmup_epochs =5if epoch < warmup_epochs:return(epoch +1)/ warmup_epochs # 线性提升else:return1.0# 保持目标学习率# 2. 初始化优化器和调度器 optimizer = torch.optim.SGD(model.parameters(), lr=0.1) scheduler = LambdaLR(optimizer, lr_lambda=warmup_scheduler)# 3. 训练循环for epoch inrange(epochs): scheduler.step()# 更新学习率for batch in dataloader:# 前向+反向传播...

效果:将batch size从64扩大到256(k=4),学习率从0.1扩大到0.4,训练时间缩短30%,收敛速度与原始batch size一致。

技巧7:早停与Checkpoint——避免“无效训练”,节省时间

痛点:训练到后期,模型开始过拟合,继续训练只是浪费时间。
原理:早停(Early Stopping)监控验证集的精度,当精度连续多个epoch不提升时,停止训练;Checkpoint( checkpoint)保存训练过程中的最佳模型,避免因中断而丢失进度。
实战步骤

  1. 定义早停条件:如,连续5个epoch验证精度不提升,停止训练。
  2. 保存最佳模型:每个epoch结束后,若验证精度优于当前最佳,保存模型权重(best_model.pth)。
  3. 恢复训练:若训练中断,从最近的checkpoint恢复模型、优化器状态、epoch数。

代码示例(早停与Checkpoint)

import torch from torch.utils.data import DataLoader, random_split # 1. 分割训练集和验证集 train_dataset, val_dataset = random_split(dataset,[0.8,0.2]) train_loader = DataLoader(train_dataset, batch_size=64) val_loader = DataLoader(val_dataset, batch_size=64)# 2. 初始化早停参数 best_val_acc =0.0 patience =5# 连续5个epoch不提升则停止 counter =0# 3. 训练循环for epoch inrange(epochs):# 训练阶段 model.train()for batch in train_loader:...# 前向+反向传播# 验证阶段 model.eval() val_acc =0.0with torch.no_grad():for batch in val_loader: inputs, labels = batch[0].cuda(), batch[1].cuda() outputs = model(inputs) val_acc +=(outputs.argmax(1)== labels).float().mean() val_acc /=len(val_loader)# 4. 早停判断if val_acc > best_val_acc: best_val_acc = val_acc counter =0 torch.save(model.state_dict(),'best_model.pth')# 保存最佳模型else: counter +=1if counter >= patience:print(f"早停于epoch {epoch+1},最佳验证精度: {best_val_acc:.4f}")break

效果:早停可节省20%-30%的训练时间(避免过拟合后的无效训练),同时保存的最佳模型比最后一个epoch的模型精度高1%-2%

技巧8:数据加载——用“内存映射”代替“读取文件”,加速大文件加载

痛点:加载大文件(如100GB的文本数据)时,pd.read_csv()慢得像“蜗牛”,占用大量内存。
原理:内存映射(Memory Mapping)将文件内容映射到虚拟内存,无需将整个文件读入内存,即可随机访问,适用于大文件加载。
实战工具

  • Pandas:用pd.read_csv(path, engine='pyarrow', memory_map=True),加速CSV文件加载。
  • NumPy:用np.memmap,加载大数组(如图片数据集)。
  • Dask:处理超大数据集(如TB级),分块加载,并行处理。

代码示例(NumPy memmap)

import numpy as np # 1. 创建内存映射文件(假设数据是(1000000, 224, 224, 3)的图片) data = np.memmap('large_dataset.dat', dtype='float32', mode='w+', shape=(1000000,224,224,3))# 2. 写入数据(模拟)for i inrange(1000000): data[i]= np.random.rand(224,224,3)# 3. 读取数据(无需加载整个文件到内存) data = np.memmap('large_dataset.dat', dtype='float32', mode='r', shape=(1000000,224,224,3)) batch = data[0:64]# 读取前64个样本,仅加载所需部分到内存

效果:加载100GB的图片数据集,用np.memmapnp.load节省80%的内存,加载时间缩短50%

技巧9:硬件加速——选对GPU/TPU,比“调参”更高效

痛点:用普通GPU(如GTX 1080)训练大模型,速度慢得无法忍受。
原理:选择适合任务的硬件,如:

  • 计算机视觉任务:优先选NVIDIA A100(有Tensor Core,加速CNN计算)。
  • 自然语言处理任务:优先选Google TPU v4(加速Transformer计算,支持更大的batch size)。
  • 分布式训练:选支持NVLink的GPU(如V100、A100),减少节点间通信时间。

实战建议

  • 预算充足:选A100 80GB(适合大模型,如GPT-3、LLaMA)。
  • 预算有限:选RTX 3090(性价比高,适合中小模型)。
  • 云服务:用AWS p3/p4实例(V100/A100)、Google Cloud TPU v4,按小时付费,节省成本。

效果对比(训练ResNet-50 on ImageNet):

硬件batch size训练时间(epoch)GPU利用率
GTX 1080 Ti6412小时60%
NVIDIA V1002562小时90%
NVIDIA A100102430分钟95%

技巧10:训练Pipeline自动化——用“工具”代替“手动”,减少重复工作

痛点:每次训练都要手动调整参数、启动进程、监控状态,浪费大量时间。
原理:用训练Pipeline工具(如Kubeflow、Airflow、MLflow)自动化训练流程,包括数据预处理、模型训练、评估、部署,减少手动操作。
实战步骤

  1. 用Kubeflow:搭建分布式训练Pipeline,支持多框架(PyTorch、TensorFlow),自动调度资源。
  2. 用MLflow:跟踪训练参数、 metrics、模型版本,方便对比不同实验的效果。
  3. 用Grafana+Prometheus:监控GPU利用率、内存占用、训练进度,实时报警。

代码示例(MLflow跟踪实验)

import mlflow import torch from torch.utils.data import DataLoader # 1. 初始化MLflow实验 mlflow.set_experiment("model_training")# 2. 开始跟踪实验with mlflow.start_run():# 3. 记录参数(batch size、学习率、epoch) mlflow.log_param("batch_size",64) mlflow.log_param("lr",1e-3) mlflow.log_param("epochs",100)# 4. 训练模型for epoch inrange(100): train_loss =0.0for batch in dataloader:...# 前向+反向传播 train_loss += loss.item() train_loss /=len(dataloader)# 5. 记录metrics(训练损失、验证精度) mlflow.log_metric("train_loss", train_loss, step=epoch) mlflow.log_metric("val_acc", val_acc, step=epoch)# 6. 保存模型到MLflow mlflow.pytorch.log_model(model,"model")

效果:用Kubeflow自动化训练Pipeline,将训练的手动操作时间从2小时缩短到5分钟,同时减少了人为错误(如参数设置错误)。

案例研究:某电商推荐模型训练效率优化

背景:某电商公司的推荐模型(基于Transformer)训练时间长达24小时,每天只能迭代1次,无法快速响应用户行为变化。
痛点

  • 数据加载慢(用pandas.read_csv加载100GB用户行为数据,需要2小时);
  • 模型大(1亿参数),单GPU训练,batch size=32,GPU利用率仅40%;
  • 没有早停,训练到100 epoch,过拟合严重。

解决方案

  1. 数据加载优化:用Dask分块加载数据,将加载时间从2小时缩短到10分钟;
  2. 分布式训练:用4张A100 GPU,DDP分布式训练,batch size扩大到128,GPU利用率提升到90%;
  3. 混合精度训练:启用AMP,内存占用减少50%,训练速度提升1.5倍;
  4. 早停与Checkpoint:监控验证集的AUC,连续3个epoch不提升则停止,训练epoch从100减少到40;
  5. Pipeline自动化:用Kubeflow搭建自动化Pipeline,每天自动触发训练,无需手动操作。

结果

  • 训练时间从24小时缩短到4小时,迭代速度提升6倍
  • 验证集AUC从0.75提升到0.82(避免了过拟合);
  • 硬件成本降低30%(用4张A100代替8张V100)。

反思

  • 分布式训练的通信瓶颈:通过调整NCCL的通信参数(如nccl_socket_ifname),将通信时间缩短了20%;
  • 混合精度的梯度下溢:通过增大梯度缩放因子(从216调整到220),解决了梯度下溢问题。

三、结论:优化训练效率,是AI项目成功的关键

总结一下,这10个技巧覆盖了训练的全流程:

  • 数据层:用流水线、内存映射加速数据加载;
  • 模型层:用剪枝、量化精简模型;
  • 训练层:用混合精度、分布式训练提升速度;
  • 硬件层:选对GPU/TPU,最大化利用率;
  • 工具层:用自动化Pipeline减少手动操作。

这些技巧不是“银弹”,需要根据具体任务调整(如计算机视觉 vs NLP,小模型 vs 大模型)。但核心逻辑是一致的:减少无效计算、最大化硬件利用率、加快迭代速度

最后,我想给你一个行动号召

  • 选1-2个你当前项目中的“训练瓶颈”(如数据加载慢、GPU利用率低),用本文的技巧尝试优化;
  • 记录优化前后的指标(训练时间、GPU利用率、精度),对比效果;
  • 在评论区分享你的优化经历,我们一起讨论!

四、附加部分

参考文献/延伸阅读

  1. PyTorch官方文档:《Distributed Data Parallel》
  2. NVIDIA博客:《Mixed Precision Training》
  3. 论文:《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour》(线性缩放规则)
  4. 书籍:《Deep Learning for Computer Vision》(模型剪枝章节)

致谢

感谢我的同事们,他们在分布式训练、混合精度训练方面给了我很多帮助;感谢PyTorch社区,提供了优秀的工具和文档。

作者简介

我是张三,5年AI架构师经验,专注于计算机视觉和推荐系统。曾主导多个大规模AI项目,优化过10+个模型的训练效率。欢迎关注我的公众号“AI架构师笔记”,获取更多实战干货。

评论区互动:你在训练模型时遇到过哪些效率问题?是如何解决的?欢迎留言分享!

Read more

电脑安装软件提示 Microsoft Visual C++ 2022 X86 Minimum Runtime 错误解决

电脑安装软件提示 Microsoft Visual C++ 2022 X86 Minimum Runtime 错误解决

@电脑安装软件提示 Microsoft Visual C++ 2022 X86 Minimum Runtime 错误解决,Microsoft Visual C++ 2013 X86 等等 电脑安装 Microsoft Visual C++ 2022 X86 Minimum Runtime 错误解决 前段时间我在安装软件时就遇见过这样的问题,百度了好久,试过安装 “微软常用运行库合集 Microsoft Visual C++” 也试过修复软件,多部分多尝试,有些操作起来麻烦 解决方法 等程序执行完之后,就不会出现这个问题 然后直接点击 “Installieren” 等程序执行完就好了。这个过程比较慢耐心等待,程序执行完之后会自动不关闭 下载之后点击启动 点击 “Download” 往下滑,点击 “DOWNLOAD FOR WINDOWS”

By Ne0inhk
【C/C++ 面试必看】深入理解内存管理:从内存分布到 new/delete 底层原理

【C/C++ 面试必看】深入理解内存管理:从内存分布到 new/delete 底层原理

🔥个人主页:爱和冰阔乐 📚专栏传送门:《数据结构与算法》 、C++ 🐶学习方向:C++方向学习爱好者 ⭐人生格言:得知坦然 ,失之淡然 文章目录 * 前言 * 一、C/C++ 程序的内存分布 * 1.内存区域划分与变量定位 * 2. 经典示例分析 * 二、C 语言的动态内存管理 * 三、C++ 的内存管理升级 * 1. new/delete操作内置类型 * 2 . 对自定义类型:new/delete 的核心优势 * 3 .malloc/free和new/delete的区别 * 四、深入底层:new/delete 的实现原理 * 五、new和delete的实现原理 * 六、定位 new 表达式

By Ne0inhk
改造红黑树实现封装 map/set:感受C++ 标准容器的精妙设计与底层实现

改造红黑树实现封装 map/set:感受C++ 标准容器的精妙设计与底层实现

容器map/set的底层是红黑树,这一篇详解红黑树如何封装实现map/set。 1.map/set设计的巧妙之处 map是key/value类型,set是key类型,两个冲突的参数类型,是如何由红黑树封装而成? 暴力思路:两个红黑树,一个kv,一个k。可是这样代码复用率极低,维护成本高。 源码思路:利用 键提取器——仿函数 提取kv、k的key,用一颗红黑树实现map,set C语言一般用函数指针,但是它十分麻烦,C++有了仿函数就很方便 接下来在红黑树基础上封装map和set 2.map和set的实现 2.1map和set的基本框架 + 原红黑树结构变化 map是key、value结构,set是key结构:  既然我们要用一个红黑树封装实现map和set,那传的参数就得通用: 原本是K,V结构,现在,要改成通用的,就用T吧 T根据需要,可选择传pair<K,

By Ne0inhk
C++ 异常处理机制与自定义异常体系

C++ 异常处理机制与自定义异常体系

目录 1.C语言传统的处理错误的方式 😊 1. 终止程序 2. 返回错误码 3.实际使用中的情况 2. C++异常概念🌼 2.1 C++异常的基本概念 2.2异常的抛出和匹配原则 2.3 异常的重新抛出 2.4 异常安全 2.5 异常规范 3. 自定义异常体系 💕😘 3.1  自定义异常类 3.2  自定义多个异常类型 3.3. 捕获自定义异常 3.4 异常层次结构设计 4.C++标准库的异常体系 😁😁 5.异常的优缺点🤣🤣  前言😘😘😘 在程序开发中,错误和异常的处理是至关重要的,它直接影响到程序的健壮性和稳定性。

By Ne0inhk