C++项目编译慢如蜗牛?(2025大会官方推荐方案大曝光)

第一章:C++项目编译性能现状与挑战

在现代大型C++项目的开发过程中,编译性能已成为影响开发效率的关键瓶颈。随着代码库规模的不断增长,头文件依赖复杂、模板实例化频繁以及构建系统配置不合理等问题日益突出,导致单次编译耗时可能达到数分钟甚至更长,严重拖慢迭代节奏。

编译缓慢的主要成因

  • 过度包含头文件,引发重复解析和依赖传递
  • 大量使用模板导致多处重复实例化
  • 缺乏预编译头文件(PCH)或模块化支持
  • 构建系统未启用并行编译或增量链接

典型编译时间对比

项目规模平均编译时间(clean build)常见问题
小型项目(<10k行)10–30秒基本可控
中型项目(10k–100k行)2–5分钟头文件依赖混乱
大型项目(>100k行)10–30+分钟模板膨胀、链接时间长

优化方向示例:启用预编译头

// stdafx.h - 预编译头主头文件
#include <iostream>
#include <vector>
#include <string>
// 其他稳定不变的头文件...

// 编译指令(GCC/Clang)
// g++ -x c++-header stdafx.h -o stdafx.h.gch
// 后续源文件自动使用预编译版本
graph TD A[源文件包含大量头文件] --> B(解析重复头文件) B --> C[语法树重建] C --> D[编译时间增加] D --> E[开发者等待时间延长]

第二章:增量编译核心机制深度解析

2.1 增量编译基本原理与依赖追踪模型

增量编译的核心在于仅重新编译自上次构建以来发生变化的源文件及其依赖项,从而显著提升构建效率。其关键机制依赖于精确的依赖关系建模与变更检测。
依赖追踪模型
现代编译系统通过静态分析建立源文件间的依赖图(Dependency Graph)。当某个源文件修改后,系统遍历该图,定位所有受影响的编译单元。
文件依赖文件是否重编译
A.goB.go, C.go是(已修改)
B.goC.go是(被依赖)
C.go-否(未变更)
变更检测与哈希校验
系统通常使用文件内容的哈希值判断是否变更:
func needsRebuild(file string, prevHash map[string]string) bool {
    current := sha256.Sum256(readFile(file))
    previous, exists := prevHash[file]
    return !exists || current != previous
}
上述代码通过对比当前与历史哈希值决定是否触发重建。哈希值存储于缓存中,确保跨次构建的连续性。依赖图与哈希机制协同工作,构成高效增量编译的基础。

2.2 文件粒度与模块化编译的效率对比

在现代大型项目中,编译效率直接影响开发迭代速度。传统的按文件粒度编译方式对小型变更仍触发大量重复工作,而模块化编译通过将相关代码组织为逻辑单元,显著减少冗余处理。
编译策略差异
  • 文件粒度:以单个源文件为单位进行编译,依赖管理粗略;
  • 模块化编译:以功能模块为单位,支持接口级依赖分析与增量构建。
性能对比示例
策略首次编译(s)增量编译(s)内存占用(MB)
文件粒度12823890
模块化1356720
// 模块导出接口定义
package user

type Service interface {
    GetUser(id int) *User
}

var Impl Service // 可插拔实现,支持编译期绑定
上述设计允许模块独立编译,仅当接口变更时才重新构建依赖方,极大提升大型系统的响应速度。

2.3 头文件包含优化与前置声明实践

在大型C++项目中,头文件的冗余包含会显著增加编译时间。合理使用前置声明(forward declaration)可减少对完整类型的依赖,从而降低编译耦合。
前置声明的优势
当仅需指针或引用时,无需包含整个类定义。例如:
class Logger; // 前置声明
class NetworkManager {
    Logger* logger_;
public:
    void setLogger(Logger* logger);
};
上述代码避免了引入 Logger.h,仅编译 NetworkManager 时无需解析 Logger 的完整结构。
包含优化策略
  • 优先使用前置声明代替头文件包含
  • 使用 #include <vector> 等标准库时,确保仅在必要时包含
  • 将私有成员移至实现文件中的 pimpl 手法
方法适用场景效果
前置声明仅使用指针/引用减少依赖,加快编译
pimpl 模式隐藏实现细节降低头文件耦合度

2.4 预编译头文件(PCH)与桥接文件应用策略

在大型项目中,频繁包含稳定不变的公共头文件会显著增加编译时间。预编译头文件(Precompiled Header, PCH)通过将常用头文件预先编译为二进制格式,大幅提升后续编译效率。
创建与配置PCH文件
以Xcode项目为例,需在项目设置中指定`Prefix Header`路径,并创建`.pch`文件:

// Prefix.pch
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
该文件在项目构建初期被编译一次,之后所有源文件共享其编译结果,避免重复解析。
Objective-C与Swift桥接策略
在混合语言项目中,桥接头文件(Bridging Header)是关键。它允许Swift调用Objective-C接口:
  • 启用“Objective-C Bridging Header”构建设置
  • 在桥接文件中导入需暴露给Swift的头文件
  • 确保模块化头文件路径正确
合理使用PCH和桥接文件,可优化编译性能并保障跨语言互操作性。

2.5 构建系统中的缓存机制与失效策略

在构建高性能系统时,缓存是提升响应速度和降低数据库负载的关键手段。合理的缓存策略不仅能加快数据访问,还需确保数据一致性。
常见缓存模式
  • Cache-Aside:应用直接管理缓存,读取时先查缓存,未命中则从数据库加载并写入缓存;写操作时更新数据库后清除缓存。
  • Write-Through:写操作同时更新缓存和数据库,保证数据一致性。
  • Write-Behind:仅更新缓存,异步刷新到数据库,适合高写入场景但存在数据丢失风险。
缓存失效策略
// 示例:设置带TTL的Redis缓存键
client.Set(ctx, "user:1001", userData, 5*time.Minute)
该代码将用户数据缓存5分钟,超时后自动失效。TTL(Time-To-Live)策略可防止缓存长期不一致,适用于数据变更不频繁的场景。
缓存淘汰算法对比
算法特点适用场景
LRU淘汰最久未使用项通用缓存
LFU淘汰访问频率最低项热点数据明显场景
FIFO按插入顺序淘汰简单队列缓存

第三章:现代C++构建工具链实战

3.1 CMake + Ninja:高性能组合配置技巧

在现代C++项目构建中,CMake与Ninja的组合显著提升编译效率。相比传统的Make生成器,Ninja通过细粒度的任务依赖分析和低开销调度机制,实现更快的并行构建。
启用Ninja作为CMake后端
在项目根目录下使用以下命令配置生成Ninja构建文件:
cmake -G "Ninja" -B build -DCMAKE_BUILD_TYPE=Release
其中-G "Ninja"指定生成器为Ninja,-B build创建构建目录,避免污染源码树。
性能优化建议
  • 使用CMAKE_INTERPROCEDURAL_OPTIMIZATION开启LTO
  • 通过CMAKE_CXX_STANDARD统一语言标准
  • 配置CMAKE_EXPORT_COMPILE_COMMANDS生成编译数据库,便于静态分析

3.2 使用Bear与Compilation Database提升依赖分析精度

在C/C++项目中,精确的依赖分析依赖于编译命令的完整记录。Bear是一个轻量级工具,可生成符合JSON格式的**Compilation Database**(`compile_commands.json`),捕获每个源文件的完整编译上下文。
生成Compilation Database
通过Bear拦截构建过程,生成标准化的编译数据库:

bear -- make
该命令在执行`make`时记录所有编译指令,输出`compile_commands.json`,包含源文件路径、编译器标志、包含路径等关键信息,为静态分析工具提供精准上下文。
提升静态分析准确性
现代分析工具(如Clang-Tidy、Cppcheck)可直接读取该数据库,确保分析时使用与实际构建一致的定义和头文件路径。例如:

#include "module/config.h"
若未指定`-I`路径,分析将失败。而Compilation Database自动提供这些信息,显著减少误报。
  • Bear支持Make、CMake、Ninja等多种构建系统
  • 输出文件为标准JSON格式,通用性强
  • 与CI/CD集成简便,提升自动化分析可靠性

3.3 Clang-Based工具链在增量构建中的优势剖析

精准依赖分析能力
Clang-Based工具链通过AST(抽象语法树)级别的语义分析,能够精确识别源文件间的依赖关系。当单个源文件修改时,仅重新编译受影响的编译单元,显著减少重复工作。
模块化编译支持
启用模块(Modules)后,头文件被预编译为二进制模块文件,避免重复解析。配置示例如下:

// 启用C++20模块支持
clang++ -fmodules -std=c++20 main.cpp -o main
该命令触发模块缓存机制,提升后续构建速度。参数 -fmodules 激活模块化编译,减少文本包含带来的冗余处理。
构建性能对比
工具链类型首次构建(s)增量构建(s)缓存命中率
传统GCC1204560%
Clang-Based1101888%

第四章:企业级项目优化案例精讲

4.1 大型游戏引擎项目的头文件瘦身方案

在大型游戏引擎项目中,头文件的膨胀会显著增加编译时间并降低代码可维护性。通过前置声明(forward declaration)替代不必要的头文件包含,是优化的首要手段。
使用前置声明减少依赖

// 原始写法:包含整个头文件
#include "Renderer.h"

// 优化后:仅声明类名
class Renderer;
上述修改避免了引入 Renderer.h 及其依赖链,仅在指针或引用场景下生效,大幅减少预处理开销。
接口抽象与Pimpl模式
采用Pimpl(Pointer to Implementation)模式将实现细节隐藏:

// Engine.h
class EngineImpl;
class Engine {
    EngineImpl* pImpl;
public:
    void run();
};
该设计使头文件不暴露具体实现类,有效切断编译依赖传播,提升模块独立性。
  • 前置声明适用于指针/引用成员
  • Pimpl模式牺牲少量运行时性能换取编译速度提升
  • 结合模块化设计可进一步优化构建效率

4.2 分布式编译与本地缓存协同加速实践

在大型项目构建中,分布式编译结合本地缓存能显著提升编译效率。通过将编译任务分发到多台节点执行,同时利用本地缓存避免重复编译,实现资源高效利用。
缓存命中优化策略
采用内容哈希作为缓存键,确保源码与依赖完全一致时复用编译产物:
// 生成缓存键:源文件内容 + 编译参数哈希
func GenerateCacheKey(sourceFiles []string, args []string) string {
    h := sha256.New()
    for _, f := range sourceFiles {
        content, _ := ioutil.ReadFile(f)
        h.Write(content)
    }
    h.Write([]byte(strings.Join(args, "|")))
    return hex.EncodeToString(h.Sum(nil))
}
该函数综合源码内容与编译参数生成唯一哈希值,避免因环境差异导致错误缓存复用。
协同架构设计
  • 调度层统一分配编译任务至分布式节点
  • 各节点优先查询本地缓存,未命中则执行编译并回传结果
  • 中央缓存服务聚合高频产物,供后续构建共享

4.3 模块(C++20 Modules)迁移路径与兼容性处理

在迁移到 C++20 模块时,需逐步将传统头文件转换为模块单元。建议从独立组件开始,使用 `module;` 声明模块接口:
export module MathUtils;
export namespace math {
    int add(int a, int b) { return a + b; }
}
上述代码定义了一个导出模块 `MathUtils`,其中包含可被其他模块导入的 `add` 函数。编译器支持如 MSVC 和 Clang 可通过 `/std:c++20` 与 `/experimental:module` 启用模块功能。
迁移策略
  • 先隔离稳定头文件,重构为模块接口单元(.ixx)
  • 保留原有头文件作为兼容层,使用 import header_name.h 方式渐进替换
  • 利用预处理器宏控制模块与传统包含的双模式编译
兼容性处理
部分旧代码依赖宏或模板特化时,可通过模块分区和显式实例化维持行为一致,确保平滑过渡。

4.4 编译时间监控体系与持续集成集成

在现代软件交付流程中,编译时间是影响持续集成(CI)效率的关键指标。建立编译时间监控体系有助于及时发现构建性能退化问题。
监控数据采集
通过在CI流水线中注入时间戳埋点,记录每个编译阶段的开始与结束时间。以下为Jenkins Pipeline中的实现示例:

def start = System.currentTimeMillis()
sh 'make build'
def duration = (System.currentTimeMillis() - start) / 1000
publishBuildMetrics(duration)
上述代码通过System.currentTimeMillis()获取毫秒级时间戳,计算编译耗时,并调用自定义函数将指标上报至监控系统。
与CI系统的集成策略
  • 在每次构建后自动推送编译时长至Prometheus
  • 通过Grafana看板可视化历史趋势
  • 设置阈值告警,当编译时间增长超过20%时触发通知
该机制实现了编译性能的可观测性,为优化构建速度提供数据支撑。

第五章:2025大会官方推荐方案全景展望

云原生架构的标准化路径
2025大会明确将Kubernetes生态作为核心基础设施标准。跨集群服务网格(Service Mesh)与eBPF结合,成为性能优化的关键方向。企业可通过以下配置实现统一观测:
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: default-metrics
spec:
  tracing:
    - providers:
        - name: otel # OpenTelemetry集成
      randomSamplingPercentage: 100
  tags:
    - key: app
      value: "%kubernetes.pod.label.app%"
AI驱动的自动化运维体系
大会推荐采用AIOps平台整合日志、指标与链路追踪数据。某金融客户通过部署Prometheus + Loki + Tempo栈,结合轻量级推理模型,实现故障自愈响应时间缩短至90秒内。
  • 日志聚类使用LogBERT模型识别异常模式
  • 指标预测基于Prophet算法提前预警容量瓶颈
  • 根因分析采用图神经网络关联微服务依赖
边缘计算与零信任安全融合
组件推荐技术栈部署模式
身份认证SPIFFE/SPIRE边缘节点证书自动轮换
网络策略Cilium Host FirewalleBPF实现细粒度访问控制
工作负载K3s + OPA策略即代码(Policy-as-Code)
[边缘节点] → (双向mTLS) → [控制平面] ↘ [SPIRE Agent] → [Workload API]
YOLOv8作物病害检测实战源码 这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

compdb/compile_commands.json的生成

compdb/compile_commands.json的生成 Compiledb-ninja ← 最简单的方法(此方式不支持Kernel仓库) https://github.com/schspa/compiledb-ninja 可参照页面说明生成。(可参考vim配置lsp) 如果遇到python模块缺失(如click),可使用以下命令安装: pip install --user click 注:可以将compiledb-ninja.py链接到PATH包含的路径中,这样就可以直接用compiledb-ni

mj475002864的博客 5180

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

产业园区运营负责人如何利用平台实现企业创新需求的精准分析与服务推送?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员在推动成果转化落地过程中,如何实现科技成果的高效推介与价值评估?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何通过数智工具提升技术需求挖掘的精准度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何构建标准化、模块化的智能服务工具?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

政府科技管理者如何在政策支持中更精准地识别和支持高价值科技项目?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

全桥LLC谐振变化器参数设计资料(闭环仿真+参数设计报告)

内容概要:本文档系统性地介绍了全桥LLC谐振变换器的闭环仿真建模与关键参数设计方法,涵盖其工作原理、谐振元件(如谐振电感、谐振电容、励磁电感)的计算与优化流程,并结合Simulink或Plecs等仿真平台构建闭环控制系统模型,重点验证变频控制策略下的软开关实现、系统增益特性、效率优化及动态响应性能。资料包含完整的仿真模型、参数设计报告、数学计算书及参考文献,支持从理论分析到工程实践的全流程研究,适用于高频高效DC-DC变换器的研发与教学应用。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校学生、科研人员,以及从事开关电源、新能源变换器、工业电源研发的工程技术人员,具备电路拓扑基础与仿真软件操作能力者更佳。; 使用场景及目标:①深入掌握全桥LLC谐振变换器的工作机理与谐振参数设计准则;②学习并实现闭环反馈控制系统的建模与稳定性分析;③支撑科研课题、课程设计、毕业设计或实际产品开发中的拓扑选型与性能验证需求;④通过仿真与计算联动提升对软开关技术与效率优化的理解与应用能力。; 阅读建议:建议结合所提供的仿真文件与设计文档同步操作,按照“建模—参数计算—仿真验证—性能分析”的流程逐步推进,重点关注频率调节对ZVS/ZCS实现的影响,对比不同负载条件下的闭环响应差异,深化对谐振腔特性和控制策略协同作用的理解。

PSIM-三相维也纳VIENNA整流器电压电流双闭环+中点电位平衡SVPWM控制仿真

内容概要:本文档详细介绍了一种基于PSIM软件实现的三相维也纳(VIENNA)整流器仿真模型,重点实现了电压电流双闭环控制与中点电位平衡的SVPWM调制策略。该仿真系统通过精确的控制算法有效提升了整流器的功率因数,降低了输入电流谐波含量,并解决了三电平拓扑中常见的直流侧中点电位偏移问题,具有较高的工程实用价值,适用于高效率、高功率密度的电力电子系统设计与科研验证。文档还整合了丰富的配套资源,涵盖多种电力电子变换器拓扑结构、先进控制算法及典型应用场景,形成了系统化的技术资料体系,有助于深入理解现代整流技术的核心原理与发展动态。; 适合人群:面向从事电力电子、电气工程、新能源变换系统等领域的科研人员、高校研究生以及具备一定仿真基础的工程技术人员。; 使用场景及目标:①深入研究三相VIENNA整流器的工作机理与控制特性;②掌握电压外环、电流内环双闭环控制结构的设计方法;③理解并实现SVPWM调制技术与中点电位平衡控制策略的协同作用;④开展相关控制算法的仿真验证、性能优化与实验对比,为高性能整流装置的研发提供理论支撑和技术原型。; 阅读建议:建议结合文中列出的其他仿真案例(如PWM整流器、LLC谐振变换器、DAB变换器等)进行横向对比学习,充分利用所提供的PSIM、MATLAB/Simulink等多平台仿真资源,重点关注控制逻辑与主电路的耦合关系,通过参数调试与波形分析深化对系统动态响应和稳态性能的理解,强化“理论—建模—仿真—优化”的闭环研究能力。

产业园区运营负责人如何利用数智工具提升园区企业的技术对接效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

政府科技管理者如何提升区域科技成果转化项目的评价与筛选效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ICD10 openGauss版

ICD10 openGauss版

上一篇: 【2025全球C++技术大会精华】:嵌入式Linux驱动开发实战十大核心技巧
下一篇: 【C++架构师必看】:为什么顶尖企业都在用AI清理遗留代码?
SimCompile
博客等级 码龄1年 140粉丝 2012原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值