34. 【C语言】性能优化意识启蒙

C++ 进阶篇——智能指针、多线程与性能优化【移动语义、RAII、线程池实战,从会写到写好】 本文为C++进阶篇,聚焦内存管理、并发编程与性能优化三大核心。通过智能指针(unique/shared/weak_ptr)实现自动内存回收,避免裸指针陷阱;运用多线程四件套(thread、mutex、condition_variable、atomic)构建线程安全的生产者-消费者模型;最后以传参优化、容器选择和缓存友好设计提升代码效率。口诀总结:不再裸new、不再裸加锁、不再乱拷贝,助力写出高效、安全、可维护的现代C++代码。 阅读详情

前面我们用 C 语言写了很多程序——从简单的计算器到链表、二叉树。它们能跑,结果也对。但“能跑”和“跑得好”之间,往往隔着一个叫性能的东西。

C 语言常被选来做系统编程、游戏引擎、嵌入式开发,一个核心理由就是它快。但快不是免费的:同样的逻辑,不同写法速度可能差出十倍、百倍。今天这篇文章不是教你去啃复杂的算法分析,而是建立性能优化的意识:知道程序为什么慢,编译器能帮你做什么,以及你自己在写代码时应该留意哪些坑。


一、优化不是“凭感觉”:先测量,再优化

性能优化的第一条铁律:不要猜,要量。你以为慢的地方,可能根本不是瓶颈;你费劲优化了一行代码,结果它对整体运行时间只贡献了 0.1%。

C 标准库提供了一个简单的计时工具:clock()。

#include <stdio.h>
#include <time.h>

int main(void) {
    clock_t start = clock();

    // 要测量的代码
    for (volatile long i = 0; i < 100000000; i++) { }

    clock_t end = clock();
    double seconds = (double)(end - start) / CLOCKS_PER_SEC;
    printf("耗时: %.3f 秒\n", seconds);
    return 0;
}

volatile 告诉编译器不要优化掉这个循环。clock() 精度不高,但用于对比不同写法足够。更精确的测量可以用 gettimeofday(POSIX)或 QueryPerformanceCounter(Windows),但思想一致:用数据说话。


二、空间换时间 vs 时间换空间

这是优化中最经典的权衡。

1. 空间换时间:缓存计算结果

如果程序里反复计算同一个值,不如算一次存起来。

糟糕:每次都重新计算 Fibonacci

int fib(int n) {
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2);  // 大量重复计算
}

fib(40) 要算上亿次函数调用。

改进:用数组缓存结果(备忘录法)

int cache[100] = {0};
int fib(int n) {
    if (n <= 1) return n;
    if (cache[n] != 0) return cache[n];
    cache[n] = fib(n-1) + fib(n-2);
    return cache[n];
}

多用了内存(缓存数组),换来了指数级的速度提升。

另一个典型例子是查表法:如果某个函数输入只有有限几种(比如三角函数值),事先算好存数组,运行时直接 table[angle] 取值,比调用 sin() 快几十倍。

2. 时间换空间:用计算换存储

反向的场景也有。嵌入式设备内存只有几百 KB,存不下大表,那就在需要时实时计算。或者是处理大规模数据时,内存放不下全部数据,就用流式处理——一次只读一块,处理完扔掉,虽然 I/O 次数多了,但内存占用恒定。

实际开发中,“空间换时间”更常见,因为内存越来越便宜,而 CPU 速度增长放缓。但最终选择取决于你的目标平台和需求。


三、减少不必要的内存分配

malloc 和 free 是有代价的。每次堆分配都涉及系统调用、内存块查找、碎片管理。在一个每秒处理几十万请求的服务器里,频繁的 malloc/free 是常见的性能杀手。

1. 栈上分配 vs 堆上分配

如果数据大小在编译时已知,用栈(局部变量、数组)远比堆快。栈分配只是移动一下栈指针,函数返回时自动回收。

// 快:栈上分配
int arr[100];

// 慢:堆上分配
int *arr = (int*)malloc(100 * sizeof(int));
// ... 使用
free(arr);

所以,小且生命周期短的变量,天然就该在栈上。

2. 对象池(Object Pool)

如果需要频繁创建和销毁同类型的结构体(比如链表结点、网络包),与其一个个 malloc/free,不如预先分配一块大内存,自己管理分配和回收。

简单示例:

#define POOL_SIZE 1024

typedef struct Node {
    int data;
    struct Node *next;
} Node;

Node pool[POOL_SIZE];
int pool_index = 0;

Node *node_alloc(void) {
    if (pool_index < POOL_SIZE) {
        return &pool[pool_index++];
    }
    return NULL;  // 池耗尽
}

这里不需要 free,池用完了整体回收即可。这种模式在游戏引擎、网络服务中极为常见,能大幅减少系统调用开销。

3. 警惕隐式内存分配

有些看起来无害的操作其实在背后分配内存,比如某些库函数内部使用 malloc。不过标准 C 库里大多数函数(strlen、memcpy、sprintf 等)并不动态分配,但要小心自己写的或第三方库的封装。


四、相信编译器,但别盲目相信:编译器优化选项

现代编译器(GCC/Clang)的优化能力非常强,远超一般程序员的直觉。你不需要手动把 i * 8 写成 i << 3——编译器会帮你做。

1. 常用优化级别

编译时通过 -O 选项启用优化:

选项含义
-O0默认,不做优化,方便调试
-O1基本优化:去除无用代码、简化算术
-O2标准优化:几乎所有的安全优化,不增加体积过大
-O3激进优化:包含更耗编译时间的优化(如循环展开、函数内联自动判断)
-Os优化体积(嵌入式常用)

在调试阶段,我们用 -g -O0 保持代码原貌;发布时务必用 -O2 或 -O3。性能差异非常明显。

2. 被优化掉的代码

int x = 5;
int y = x * 10;
// 如果后面没用到 y,编译器在 -O1 下就可能完全删掉这两行

当你写测试循环时,如果变量从未被读取,循环本身可能被优化掉,导致时间测量失准——这就是为什么我们用 volatile 或让变量产生输出。

3. 优化可能引入的问题

编译器优化可能改变指令顺序、消除你认为是“必须执行”的代码。依赖特定内存顺序的多线程程序,在优化下可能暴露竞态问题。这一点以后讲并发时会详细说。

总结:日常写代码时,把心思花在算法和数据结构上,而不是那些微小的“技巧”。把 -O2 打开,让编译器处理它擅长的部分。


五、restrict 关键字:给编译器更多信息

restrict 是 C99 引入的指针限定符,它告诉编译器:这个指针是访问它所指向的数据的唯一方式(没有其他指针指向同一块内存)。这能帮助编译器做更激进的优化。

典型场景:内存拷贝函数。

void *my_memcpy(void *restrict dest, const void *restrict src, size_t n) {
    char *d = (char*)dest;
    const char *s = (const char*)src;
    for (size_t i = 0; i < n; i++) {
        d[i] = s[i];
    }
    return dest;
}

restrict 承诺 dest 和 src 不重叠。如果它们重叠,行为是未定义的。这个承诺让编译器可以生成更高效的汇编(比如使用 SIMD 指令一次复制多字节),而不是保守地逐字节处理。

标准库的 memcpy 就使用了 restrict,而 memmove 没有——因为 memmove 必须保证重叠区域也能正确复制。

使用条件:你确实能保证这个指针在整个生命周期中是唯一的访问路径。如果传了重叠地址,后果自负。所以只在明确不会重叠时使用。


六、inline 函数:消除函数调用开销

函数调用本身有成本:压栈、传参、跳转、返回。对于频繁调用的小函数(比如 max、min、简单的 getter),这个成本相对较大。

inline 关键字建议编译器把函数体直接展开到调用处,省去调用开销。

static inline int max(int a, int b) {
    return (a > b) ? a : b;
}

不过要注意:

  • inline 是建议,不是命令。编译器会自行判断是否真的展开(太复杂会拒绝)。
  • 过度使用会导致代码体积膨胀(每处调用都复制一份),反而降低指令缓存命中率。
  • 在头文件中定义 inline 函数时,通常需要配合 static 避免多重定义。

在现代编译器中,-O2 及以上优化会自动做内联决策,手工写 inline 的意义更多是给优化器一个强烈的提示,或者用来定义必须在头文件中可用的简短函数。


七、最大的优化:选择正确的算法和数据结构

在纠结 i++ 还是 ++i 之前,先看一眼你的算法复杂度。

  • 对一个百万元素的数组线性搜索,O(n)。改用哈希表或二分查找,O(log n) 甚至 O(1),差距是天壤之别。
  • 在链表中频繁按下标访问,O(n)。换成数组是 O(1)。反过来,频繁在中间插入删除,数组是 O(n),链表是 O(1)。

算法和数据结构的选择,决定了性能上限。具体细节的优化,只是在逼近这个上限。所以,树立性能意识的第一件事,是先想清楚:我的数据结构对吗?我的算法复杂度合理吗?


八、常见误区:过早优化是万恶之源

Donald Knuth 的名言值得铭记:“过早优化是万恶之源。”

初学阶段,你可能会忍不住想把所有能优化的地方都优化了——变量全用 register(现在编译器基本忽略),每个小函数都标 inline,所有除法都试图移位……但结果是代码变得晦涩难懂,而性能几乎没有提升。

建议的优先级:

  1. 先写正确、清晰的代码。
  2. 用工具找到真正的瓶颈(Profile)。
  3. 只在瓶颈处针对性地优化。
  4. 优化后再次测量,验证效果。

永远不要牺牲可读性去换取你不确定的性能收益。编译器比你更擅长微优化,而清晰的代码让你更容易发现真正的算法级优化机会。


九、小结

今天这篇文章没有教你成为性能调优大师,而是为你种下了性能意识的种子:

  • 用 clock() 等工具测量,别凭感觉猜。
  • 空间换时间(缓存、查表)是最常见的优化策略,时间换空间在内存紧张时可用。
  • 减少不必要的 malloc/free,小对象用栈,批量分配用对象池。
  • 编译时开启 -O2 或 -O3,让编译器替你完成微优化。
  • restrict 和 inline 是优化器的高级“沟通”手段,需要明白背后的语义再使用。
  • 算法与数据结构的选择远比细节优化重要。
  • 别让优化损害可读性,先写对,再优化。

性能优化是一个实践性很强的领域,需要在真实项目中积累经验。你现在已经有了一张“意识地图”,在之后学习更高级的数据结构、操作系统、并发编程时,这些意识会帮你做出更好的设计决策。

下一篇文章,我们将开始进入系统编程的世界——学习如何与操作系统打交道:文件底层 I/O、系统调用、文件描述符。那些 open、read、write 不再只是函数名,而是你程序与内核对话的接口。


课后小练习

  1. 写两个版本的 Fibonacci 计算函数(递归版 vs 缓存版),用 clock() 计时计算 fib(40),比较两者耗时。
  2. 用 malloc 循环分配 100 万次 int 并立即释放,测量耗时。再用栈数组或静态池实现同样的逻辑,比较耗时差异。
  3. 声明两个 restrict 指针,写出一个矩阵加法函数(C = A + B),然后思考:这里能用 restrict 吗?为什么?(提示:C 和 A/B 重叠的情况可能吗?)
  4. (思考)下面的函数在 -O2 优化下,空循环会被删掉吗?如果会,你如何防止它被优化,以便准确测量时间?
    void waste_time(void) {
        for (int i = 0; i < 1000000; i++) { }
    }
    

我们下期见!

💡获取本系列示例代码请访问 GitCode 仓库。

博士申请-考核制经验分享(2)——个人简历 申博过程中一般在联系导师时就将个人简历作为邮件附件,有些学校也会在提交材料或者复试阶段提交个人简历。 阅读详情

相关推荐

STM32H743+YT8512C以太网通信实战:CubeMX与LWIP配置详解

本文详细解析了基于STM32H743微控制器与YT8512C PHY芯片的以太网通信实战方案。通过CubeMX工具进行RMII接口、MPU、时钟树等关键硬件配置,并重点阐述了如何修改LWIP协议栈驱动代码以适配YT8512C芯片,解决了LAN8742驱动不兼容的问题。文章提供了从工程创建、代码适配到调试验证的完整步骤,帮助开发者快速实现稳定可靠的嵌入式网络连接。

weixin_29190573的博客 558

闪控窗性能优化与多实例资源治理【鸿蒙心迹】

本文是闪控窗系列第三篇,聚焦**多实例场景下的资源治理**。针对用户高频开关、多任务切换导致闪控窗实例越攒越多、内存与绘制开销失控的问题,给出"实例有上限、绘制会节流、销毁能统一"的完整方案:用全局单例 `FloatMgr` 统筹实例,设硬上限(建议 3 个)并淘汰最旧;用空闲实例池复用避免频繁 create/destroy;用 `Animator` 把静止态刷新压到 1fps 甚至停更;页面销毁与退后台统一 `releaseAll`,并配合 5 分钟超时回收。

wdracky的专栏 276

CocosCreator视频播放黑屏?手把手教你封装VideoPlayer组件解决Web环境问题

本文针对Cocos Creator在Web环境下视频播放黑屏等常见问题,提供了一套工程化的VideoPlayer组件封装解决方案。文章深入剖析了浏览器自动播放策略、DOM样式隔离等核心挑战,并手把手教你实现一个健壮的管理器,涵盖兼容性处理、性能优化与内存管理,确保视频播放稳定流畅。

plum99的博客 598

〖物流终端实战 05〗纯血鸿蒙 ArkTS 高阶性能优化:长列表渲染、组件复用与内存泄漏排查

本文深度剖析鸿蒙ArkTS高阶性能优化,直击长列表卡顿与内存泄漏痛点。针对渲染,指出ForEach全量构建的缺陷,强调采用LazyForEach(V2推荐Repeat)配合增量通知及稳定业务Key;针对组件复用,明确@Reusable仅复用实例不重置状态,必须在aboutToReuse中手动清理UI状态;针对内存泄漏,总结全局监听未注销、定时器未清理及长生命周期对象持有页面引用三大元凶,并指导通过DevEco Profiler的Heap快照排查引用链。文章强调优化需遵循“先定位后改代码”原则,助力开发者打造

Eyf • 半字节的博客 631

liquibase扩展支持达梦数据库

近期项目中需要支持国产数据库,需要liquibase底层支持达梦数据库,记录下操作的详细步骤以便分享。 1.liquibase支持的数据库很多如MySQL, PostgreSQL, Oracle, Sql Server, DB2。但是达梦数据库并不支持,所以需要新建DMDatabase类来适配达梦数据库。达梦语法和Oracle很像所以只需要复制liquibase-core下的Oracle Database做些修改就可了。以下为需要修改的地方 public class DMDatabase extends A

qq_43677719的博客 5472

MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能

该MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能。输出曲线可直接用于验证设计的合理性(如是否存在过流面积突变或不足)。的不同范围,选择对应的几何模型计算过流面积。通过分段逻辑计算柱塞腔在不同旋转角度(过流面积在特定条件下会被限制(如。),确保结果符合物理实际。条件分支,根据旋转角度。

huanghm88的专栏 581

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 519

YOLO26-seg分割优化:轻量化卷积魔改 | 新的partial convolution(PConv)结合C3k2 | CVPR2023

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 149

RISC-V 基础软件的工程化与性能优化实践

从软件生态现状、优化方法到在龙蜥社区、如意社区等的开源贡献,这些探索展现了基础软件连接硬件能力与业务价值的作用,也为 RISC-V 生态共建提供了实践参考。

weixin_60347558的博客 358

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2453

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1018

ABAP 程序性能优化总结

排序要按照字段的读取顺序进行排序!否则二分法BINARY SEARCH会读取失败。推荐「在 DB 做 LEFT JOIN」,而不是读出來再 READ 匹配。尽量减少第一步结果集的行数,这样可以大量减少后续连接大表时的耗时。减少辅助表的行数,也就是需要读取数据的内表的行数。程序性能优化、效率优化、速度优化。

weixin_44686958的博客 160

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

医院医学学术交流语音处理性能优化实践:单机CPU瓶颈、并发控制与硬件边界分析

针对医院医学学术交流中的语音转写与多语种翻译需求,分析单机CPU处理瓶颈,通过任务队列、并发控制和资源监控优化系统吞吐量与运行稳定性。

HySpark的博客 336

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

.NET 性能优化:先找瓶颈,再谈技巧

NET 性能优化没有“一招鲜”。Span<T>ValueTaskstackalloc这些工具在特定场景下确实很强,但它们解决的是微观层面的分配问题。如果你的应用瓶颈在数据库查询或者线程池阻塞,用再多Span<T>也救不回来。先测量,找到热路径,再针对性修改,改完再测量验证。跳过第一步的优化,大概率是在给编译器添乱。

qq_41019429的博客 355

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

美团发布新一代大模型LongCat-2.5,面向长程智能体任务的原生多模态模型

从LongCat-2.5的技术路线看,模型升级重点已经从单纯扩大参数规模,转向视觉统一建模、长程Agent训练、训推一致性和国产算力适配等系统工程。尤其是在复杂代码库开发、3D页面生成和多轮工具调用等任务中,模型能否持续执行、验证结果并根据失败轨迹修正策略,将成为衡量Agent能力的重要指标。LongCat-2.5把原生视觉理解与长程Agent训练结合起来,也意味着多模态模型正在从“看懂内容”进一步走向“完成任务”。

Enweitech Software Works 212

用用户认证系统一次讲清 Serverless 性能优化实战

在现代 Web 应用开发中,用户认证与权限管理是不可或缺的模块。随着业务规模的扩大,传统的服务器部署模式逐渐暴露出响应延迟、资源浪费等问题。Serverless 架构因其按需付费、自动扩展的特性,成为许多开发者的首选。然而,在实际使用过程中,开发者往往忽视了对 Serverless 函数性能的优化,导致用户体验下降、成本增加。本文将围绕一个真实的用户认证场景展开,通过基准测试定位性能瓶颈,并进行一系列优化措施,最终实现响应时间降低 60% 的显著提升。

后台模板 183

从内核源码出发:卡顿/冻屏/黑屏问题的日志关键字速查与性能优化实战指南

第一步:dmesg 大口径过滤第二步:命中后定位源码用日志原字符串 grep 源码树 → 落到 file:line → 看触发条件第三步:顺栈分析调用栈最底层函数 → grep 调用者 → 检查锁/中断/睡眠上下文是否合法第四步:量化验证(日志无命中时)ftrace/perf 抓取 → 量化 runnable 延迟 / 回收耗时 / VSync 间隔第五步:优化修复按第六节子系统优化清单逐项验证核心心法:关键字记忆是辅助,"拿串搜树"才是本能。每一个pr_errpr_warn。

weixin_43228946的博客 202

Python 进阶实战:装饰器、生成器、描述符与 GIL 并发一篇打通【上下文管理器、元类、asyncio 异步、性能优化】

本文深入解析Python进阶核心机制:装饰器的闭包本质、生成器的惰性协程特性、描述符的属性控制协议及GIL下的并发真相。通过可运行代码与面试追问点,揭示“会写”与“懂”的分水岭,助开发者突破熟练层,真正掌握语言底层逻辑,实现编程能力跃迁。

王大师企业官方博客 994

Coding Agent 推理性能优化:Decode、KV Cache 与多 Session 调度

单用户 Decode 提升 2.8 倍,单实例吞吐提升 5.6 倍。

2501_92842654的博客 217

开源多维表格SmartTable v1.6.10 —— 用户名登录、数据评论及@人、表单分享二维码、性能优化、部署及升级优化

这版主要干了这几件:💬。

Binac二维思索 257

Chrome浏览器视频播放性能优化配置完整指南

本文从网络排查、硬件加速验证、核心参数配置、缓存清理、扩展管理等维度,手把手带你解决Chrome浏览器视频卡顿、跳帧、CPU占用过高的问题,快速实现4K视频流畅硬解码。

the3clipse的博客 340

上架冷启动性能优化与启动耗时治理【鸿蒙心迹】

本文针对鸿蒙应用冷启动慢、用户“秒开变转圈”的痛点,提出“阻塞/并行/延迟”三档任务拆解法,结合hiTraceMeter打点量化耗时,将首屏可交互时间从2.8s降至0.9s(降68%)。提供可复用代码骨架、任务分档清单与实战清单,强调首屏只做必需事、非关键操作延迟执行,并通过限流、骨架屏等策略优化体验。核心建议:启动路要“修干净”,发版前真机测试卡点≤1s,确保上架后口碑不被差评拖累。

wdracky的专栏 239

Kimi K3.1 Pro来了:基于CANN的Day0推理支持与性能优化

10月24日,Moonshot AI发布Kimi K3.1 Pro,并于11月4日正式开源。CANN完成Kimi K3.1 Pro的Day0支持与优化,助力开发者在昇腾平台上快速部署与体验。

m0_71340392的博客 336

VisionPro高级案例——位置检测

基于VisionPro高级脚本,实现多色药片自动分拣与计数:通过CogColorExtractor按颜色分组提取掩膜,动态输入CogBlobTool进行连通域分析,精准定位每粒药片质心并标注坐标;在界面上以红十字标记中心点,上方汇总显示各颜色药片数量。代码支持批量处理多张图片,具备高可扩展性,适用于多色物料分类场景。

weixin_66547608的博客 438

2026-11-04-RemoteControl-性能优化-对比评测-踩坑排错

零依赖 Node.js Web 远控:15fps 档实测仅 2.7 帧,单帧 132KB,10 客户端出口 21.7Mbps。本文拆开截屏到渲染全链路,算清帧率与带宽账,给出 9 条协议性能坑及长驻进程、差分、背压的优化清单。

Dai_sir_man的博客 183

【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优

移动端 Store Actions 设为 Auto/Discard在低端移动平台上,将 Store Actions 设为 Auto 或 Discard,避免 URP 把每一遍的渲染目标都复制到内存中。Volume Update Mode 设为 Via Scripting默认情况下 URP 每帧都更新 Volume,如果你的 Volume 不常变,改成脚本手动更新,能省不少 CPU。内存带宽、CPU、GPU 三个维度各有关键配置项,用对了能在不牺牲画质的前提下,帧率提升 30% 以上。

crystal_WJT的博客 999
上一篇: 33. 【C语言】调试技巧与工具
下一篇: 35. 【C语言】与操作系统对话:系统调用与文件底层 I/O
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值