静态库 vs 动态库:-fPIC、PLT/GOT、LD_PRELOAD、链接顺序

为什么类型论是函数式编程的理想基础? 函数式编程(如Haskell、Scala、OCaml)以“函数为核心”“无副作用”“不可变数据”等特性著称,但它的“安全高效”并非凭空而来——背后的关键支撑是类型论。本文将聚焦“类型论如何支撑函数式编程”,从基础概念到具体案例,解释两者的本质联系。本文将按“故事引入→核心概念解释→关系拆解→原理+代码案例→实际应用→总结”的逻辑展开,用“乐高积木”“菜谱”等比喻贯穿全文,确保抽象理论可视化。类型论:程序的“接口规则手册”,定义类型和函数的约束;函数式编程。 阅读详情

同一份源码,编成静态库(.a)和动态库(.so),链接方式完全不同——一个把代码复制进可执行文件、一个在运行时才加载,体积和依赖各有取舍。这篇用 nm/readelf/ldd/size 的真实输出把这套「链接与加载」机制讲透,包括动态库为什么必须 -fPIC、函数调用怎么走 PLT/GOT 延迟绑定、LD_PRELOAD 怎么劫持符号,以及 -l 链接顺序为什么讲究。

1. 引子:静态 vs 动态,size 一眼看穿

先看两个要被编进库的函数。它们本身普通得很,但「怎么打包进可执行文件」决定了最终的体积和依赖:

#include <iostream>

// 这两个函数之后会被分别编成静态库 .a 和动态库 .so
int square(int x) { return x * x; }
int cube(int x) { return x * x * x; }

int main() {
    std::cout << "square(6) = " << square(6) << '\n';
    std::cout << "cube(3)   = " << cube(3) << '\n';
}
square(6) = 36
cube(3)   = 27

把同样的函数编成静态库和动态库,再各自链接出可执行文件,用 size 看体积(godbolt gcc 13.2 实测):

$ size static_demo        # 静态链接:square/cube 被复制进可执行文件
   text    data     bss     dec     hex filename
   1268     624       8    1900     76c static_demo

$ size dyn_demo           # 动态链接:可执行文件里只有一小段调用桩
   text    data     bss     dec     hex filename
   1356     656       8    2020     7e4 dyn_demo

有意思的是,square/cube 小到各只有一条乘法指令,静态链接的 text 段(1268)反而比动态链接(1356)还小。动态链接的可执行文件要额外装 PLT 桩、GOT、动态段这些「调用基础设施」。「动态一定更省体积」只在库很大(比如整个标准库)时才成立;对几个小函数,静态链接可能更省。这个实测也提醒我们:体积结论要看库的大小,别记死结论。

维度静态库 .a动态库 .so
代码位置链接时复制进可执行文件运行时由动态链接器加载
可执行文件体积大库时大、小函数时可能更小大库时小、小函数时要装 PLT/GOT
运行时依赖无(自包含)依赖 .so 存在且版本匹配
库更新需要重新链接换 .so 即可(ABI 兼容前提下)
多进程共享内存不共享代码段可被多个进程共享

官方文档:CMake add_library 说明 STATIC 与 SHARED 两种库目标。

2. 静态库:链接时复制,nm 看符号

静态库本质是 .o 目标文件的打包(ar 归档)。链接时,链接器只把被引用的目标文件复制进可执行文件,没被引用的不复制。

$ nm -C libmystatic.a
0000000000000000 T square(int)
0000000000000000 T cube(int)

square 和 cube 都是全局符号 T,链接时按需复制。

3. 动态库:运行时加载,ldd 看依赖

动态链接的可执行文件启动时,动态链接器(ld.so)按 DT_NEEDED 记录去找 .so。ldd 列出完整依赖链,readelf -d 直接看 ELF 动态段里的 NEEDED:

$ ldd dyn_demo
        linux-vdso.so.1 (~~)
        libmydyn.so => /app/build/libmydyn.so (~~)
        libstdc++.so.6 => /opt/compiler-explorer/gcc-13.2.0/lib64/libstdc++.so.6 (~~)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (~~)
        libgcc_s.so.1 => /opt/compiler-explorer/gcc-13.2.0/lib64/libgcc_s.so.1 (~~)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (~~)
        /lib64/ld-linux-x86-64.so.2 (~~)

$ readelf -d libmydyn.so | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

ldd 里的 libmydyn.so => /app/build/libmydyn.so 证明:可执行文件里没有 square/cube 的代码,只有一个「去找 libmydyn.so」的记录;真正解析函数地址发生在程序启动时。

官方文档:GNU ldd 手册 与 readelf 手册 说明如何查看动态依赖。

4. 为什么动态库必须 -fPIC

动态库会被加载到任意内存地址(每次加载基址都可能不同),所以库里的代码不能假设固定地址——必须编译成「位置无关代码」(Position-Independent Code,PIC)。-fPIC 让代码通过 GOT(全局偏移表)间接访问全局变量和函数,而不是硬编码地址。下面的 calc.o 里访问了全局变量 global_counter,不加 -fPIC 去编 .so 会直接报错(真实报错):

$ g++ -shared -o libbad.so calc.o     # calc.o 没有 -fPIC
/usr/bin/ld: calc.o: relocation R_X86_64_PC32 against symbol `global_counter'
can not be used when making a shared object; recompile with -fPIC
collect2: error: ld returned 1 exit status

官方文档:GCC -fPIC 选项 说明位置无关代码的生成方式。

5. PLT/GOT:函数调用为什么能「延迟绑定」

动态链接的可执行文件调用外部函数时,编译期不知道函数真实地址,于是走「PLT + GOT」两级跳:

调用 square() 的流程(第一次调用后)
  main 里  call square@plt
            └─> PLT 条目:jmp *GOT[square]   (GOT 里已存真实地址)
                  └─> 真正的 square() 代码

第一次调用前:GOT[square] 指向 PLT 的下一条指令,
触发动态链接器去 .so 里解析真实地址,写回 GOT —— 这叫「延迟绑定」(lazy binding)。

好处:不用的符号不解析,启动更快;解析一次后后续调用直接跳真实地址,几乎零开销。

6. LD_PRELOAD:劫持符号

LD_PRELOAD 环境变量指定的 .so 会最先被加载,其中定义的符号优先于其他库。于是可以在不重新编译程序的情况下「劫持」某个函数。先看一个正常返回 1 的函数(这里为演示直接定义在 main 里,真实场景它来自某个 .so):

#include <iostream>

// 真实场景里 get_value 来自某个动态库;这里定义在 main 里便于单文件运行
int get_value() { return 1; }

int main() {
    std::cout << "get_value() = " << get_value() << '\n';
}
get_value() = 1

劫持库定义一个同名函数,返回值不同:

// fake.cpp —— 编成 libfake.so,LD_PRELOAD 加载后优先匹配
extern "C" int get_value() { return 999; }

在真实多文件工程里(get_value 来自 libgreet.so),LD_PRELOAD 劫持效果如下(godbolt 容器实测):

$ ./demo                          # 正常:来自 libgreet.so 的版本
get_value() = 1

$ LD_PRELOAD=./libfake.so ./demo  # 劫持:优先匹配 libfake.so 的版本
get_value() = 999

LD_PRELOAD 常用于调试、mock、注入监控代码;但生产环境滥用会引入安全和稳定性风险,只应在可控环境使用。

7. 链接顺序:-l 顺序为什么重要

静态库链接是单遍扫描:链接器从左到右处理 -l 库,只有「当前未解析符号」才会去后面的库里找。所以被依赖的库要放在依赖它的库后面。liba 调用了 libb 的函数,正确顺序是 -la -lb,反过来报 undefined reference:

$ g++ main.o -lb -la        # 错误:处理 libb 时还没有需要它的符号
/usr/bin/ld: liba.a(a.o): undefined reference to `b_func'
$ g++ main.o -la -lb        # 正确
(链接成功)
顺序结果
-la -lb(被依赖的 b 在后)成功
-lb -la(b 在前)undefined reference to b_func

官方文档:GNU ld 手册 中 -l 选项说明库的搜索与扫描顺序。

8. 完整示例:一个库函数 + 静态/动态链接对比

把「库函数」这个核心概念落成一个能跑的完整程序,然后用 size/nm/ldd 看静态链接与动态链接的差异。

#include <iostream>

// 这就是「库」要提供的能力:两个纯函数
int square(int x) { return x * x; }
int cube(int x) { return x * x * x; }

int main() {
    // 用确定的结果自检,证明链接正确
    std::cout << "square(6)=" << square(6) << '\n';
    std::cout << "cube(3)=" << cube(3) << '\n';
    std::cout << (square(6) == 36 && cube(3) == 27 ? "自检通过\n" : "自检失败\n");
}
square(6)=36
cube(3)=27
自检通过

在真实多文件工程里(calc.cpp 编成 .a 和 .so 各一份,main.cpp 分别链接),体积、符号、依赖对比如下(godbolt 实测):

$ size static_demo   # 静态链接:代码复制进可执行文件
   text    data     bss     dec     hex filename
   1268     624       8    1900     76c static_demo

$ size dyn_demo      # 动态链接:可执行文件里只有调用桩
   text    data     bss     dec     hex filename
   1356     656       8    2020     7e4 dyn_demo

$ nm -C libmystatic.a   # 静态库符号:全局 T,链接时复制
0000000000000000 T square(int)
0000000000000000 T cube(int)

$ ldd dyn_demo          # 动态链接的可执行文件依赖 .so
        libmydyn.so => /app/build/libmydyn.so (~~)
        libstdc++.so.6 => ~~ (~~)
        libc.so.6 => ~~ (~~)

9. 延伸阅读

本知识库内的相关篇目:

10. 一句话总结

静态库链接时按需复制代码(自包含、体积大、无运行时依赖),动态库运行时加载(体积小、可共享、但依赖版本匹配);动态库必须 -fPIC 以支持任意地址加载,跨库函数调用走 PLT/GOT 延迟绑定,LD_PRELOAD 利用加载顺序劫持符号,而静态链接的单遍扫描决定了 -l 顺序(被依赖的库放后面)。

【SystemVerilog笔记(一)】数据类型 (一)内建数据类型 1.按照四值逻辑和二值逻辑分类 四值逻辑类型:integer、logic、reg、wire等线网类型 二值逻辑类型:byte、shortint、int、longint、bit 2.按照有符号和无符号分类 有符号类型:byte、shortint、int、longint、integer 无符号类型:bit、logic、reg、wire等线网类型 ※记忆:按位定义的变量是无符号的。 (二)软件常用类型 1.定宽数组 在这里插入代码片 ... 阅读详情

相关推荐

计算机技术发展5大阶段,现阶段计算机技术应用及发展

【摘要】现代计算机科学技术的发展和普及运用,为世界各国民众基础性生产生活实践活动的组织开展路径造成了深刻影响,本文围绕现阶段计算机技术应用及发展,择取两个具体方面,展开了简要分析。【关键词】计算机技术;应用;发展改革开放以来,计算机设备的广泛运用,促进了计算机科学技术的逐步发展成熟。计算机科学技术是具备新兴表现特征的尖端应用技术,其在现代工业生产和社会生活实践活动过程中的广泛引入运用,给世界各国基...

weixin_42126677的博客 2637

【Linux C/C++】Linux GCC 库函数替换深度技术指南

摘要: 本文深入解析Linux环境下两种动态库函数拦截技术:链接期(--wrap)和运行期(LD_PRELOAD)。链接期方案通过GCC的--wrap选项实现符号重定向,需重新编译链接;运行期方案利用动态链接器符号查找顺序,通过LD_PRELOAD环境变量注入自定义库实现运行时拦截。两种方案各有优缺点:--wrap需重链接但对dlopen无效,LD_PRELOAD无需修改程序但可能引发符号冲突。文章详细阐述实现步骤、底层原理(ELF符号解析、PLT/GOT机制)及注意事项(C++名称修饰、内部调用限制等),

love131452098的博客 997

相机光学(三十八)——VCM(Voice Coil Motor)音圈马达

VCM(Voice Coil Motor)音圈马达全称Voice Coil Montor,电子学里面的音圈电机,是马达的一种。因为原理和扬声器类似,所以叫音圈电机,具有高频响、高精度的特点。其主要原理是在一个永久磁场内,通过改变马达内线圈的直流电流大小,来控制弹簧片的拉伸位置,从而带动上下运动。手机摄像头广泛的使用VCM实现自动对焦功能,通过VCM可以调节镜头的位置,呈现清晰的图像。弹片式结构滚珠式结构摩擦式结构Open loop开马达Close loop闭环马达。

图像学习之旅 7222

C/C++静态库与动态库编译实战:从原理到工程实践

在C/C++开发中,库是代码复用和模块化设计的核心机制,理解其编译与链接原理是工程师进阶的必备技能。静态库和动态库的本质区别在于链接时机与内存管理方式:静态库在编译时将代码直接拷贝到可执行文件中,而动态库则在运行时由操作系统加载并映射到进程地址空间,实现多进程间的代码共享。掌握符号可见性控制与位置无关代码(PIC)等关键技术,能有效提升库的安全性、减小体积并确保跨平台兼容性。这些技术对于封装核心算法模块、集成第三方依赖以及优化大型项目构建流程具有重要价值。本文以实战为导向,系统解析了从源码编译到部署的完整路

weixin_34088583的博客 439

【论文阅读笔记】One Shot 3D Photography

论文主页:https://facebookresearch.github.io/one_shot_3d_photography/ 代码地址:https://github.com/facebookresearch/one_shot_3d_photography   该3D照片方向,由于刚入门,所以会倾向于翻译文章。每个操作上的选择,及为什么不进行另外操作的原因都如数放上。 论文小结   本作的工作是从单张RGB图片生成一个移动视角的3D照片。   其管道大致如下: 由RGB图像通过单目深度估计网络估计深度图

时光机 °的博客 1839

ENVI中Landsat8大气校正法实现地表温度精准反演

本文详细介绍了在ENVI软件中,利用大气校正法对Landsat8热红外数据进行地表温度反演的完整流程。该方法通过辐射定标、大气参数获取、发射率估算及温度转换四个核心步骤,精准剔除大气干扰,还原地表真实温度,是城市热岛效应监测、农业旱情分析等应用的关键技术。

weixin_29292535的博客 150

Linux 动态链接与动态库加载深度解析

本文深入解析Linux中的动态链接与动态库加载机制,对比静态链接与动态链接的优缺点,并详细阐述ELF文件格式、动态链接器(ld.so)的工作原理及动态库搜索路径。重点介绍了运行时动态加载API(dlopen/dlsym)的使用方法及其线程安全特性,探讨了版本控制、位置无关代码(PIC)等高级主题,并提供常用调试工具和实际应用场景。动态链接机制通过代码复用和内存优化,为现代操作系统提供了灵活的模块化支持,广泛应用于服务器软件和容器化技术。

likuolei的博客 374

车载以太网测试技术解析

在智能汽车与HiL测试领域,高效解析与模拟车载网络通信是开发验证的关键。ZD-Converter 2000以媒体/介质转换器、嗅探器、拦截器、仿真器四合一的颠覆性设计,成为工程师应对复杂车载以太网测试的瑞士军刀。它支持双路车载/标准以太网智能转换、实时通信嗅探、硬件级数据拦截及ECU通信模拟,更通过串口命令实现全参数远程配置,赋能自动化测试流程。本文将深度解析其核心功能与实战应用场景。

Triv2025的博客 1143

Chrome 性能优化实战指南:2026 前端页面提速与内存优化全攻略

2026年Chrome已切换为双周更新节奏,页面性能优化规则也随之迭代。本文详解Chrome性能面板高级用法、内存泄漏排查、渲染路径优化与最新API落地技巧,帮助你把页面首屏速度提升50%以上。

Frag0ut的博客 312

把 Custom Business Configurations 变成你的定制化维护台:Business Configuration Maintenance Object 设置全解

摘要:SAP BTP的Business Configuration(BCMO)为ABAP环境提供标准化的配置维护方案,通过RAP对象暴露为OData V4服务,自动生成Fiori elements维护界面,省去单独开发应用的成本。关键配置包括:Service Configuration定义业务名称和分组;List Report控制初始加载和视图变体;Object Page配置布局(Tabs/Page)和编辑权限;Table Settings选择表格类型(Grid/Responsive)和创建模式(Inlin

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

《备考信息系统项目管理师》 - 专栏介绍和目录

本专栏会持续详细梳理软考高级信息系统项目管理师(高项)的考点、所有历年真题(包括综合知识、案例分析、论文)等,有论文专项,预测模拟题等内容。需要的可以先订阅下哦。

数据知道的博客 2万+

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

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

wdracky的专栏 299

基于STM32LXXX的模数转换芯片ADC(TLA2528IRTER)驱动C程序设计

define TLA2528_ADDR 0x12 << 1 // 用于HAL传输的8位地址(写入为0x24,读取为0x25)// 100kHz (示例值,需根据实际时钟计算)#define TLA2528_REG_PIN_CFG 0x00 // 引脚配置寄存器。#define TLA2528_REG_CHN_SEL 0x01 // 通道选择寄存器。

myron6688的博客 230

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

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

Eyf • 半字节的博客 681

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

2301_79189962的博客 556

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

weixin_60347558的博客 403

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

qq_41019429的博客 378

Caddy反向代理性能优化实战:基准测试到瓶颈定位的5大关

在数据统计报表与BI系统中,反向代理作为流量调度的关键节点,其性能直接影响到整体系统的响应效率。Caddy作为一种轻量级、高性能的Web服务器和反向代理工具,常被用于此类场景。然而,随着访问量的增长,若未进行适当的性能优化,系统可能会出现延迟高、吞吐低等问题。本文将结合真实业务场景,深入探讨如何通过基准测试、瓶颈定位以及优化手段提升Caddy在数据报表服务中的性能表现,并提供可复用的实践经验。

wuchangjian的专栏 176

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

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

HySpark的博客 353

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

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

weixin_43228946的博客 218

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

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

王大师企业官方博客 2949

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

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

2501_92842654的博客 235

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

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

Binac二维思索 277

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

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

the3clipse的博客 374

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

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

wdracky的专栏 251

Spring Boot 性能优化实战:从启动加速到运行时调优

本文结合微服务扩缩容与高并发场景,梳理 Spring Boot 应用在启动速度与运行期性能上的优化路径。内容涵盖懒加载与类索引的配置细节、GraalVM AOT 编译的落地条件与边界、JVM 参数在容器环境下的正确设置、线程池与连接池的容量测算方法,以及基于 Arthas 和 JFR 的线上诊断流程。通过具体配置示例、压测对比思路和排查路径,给出可验证的调优步骤,帮助后端团队在有限资源下平衡冷启动成本与吞吐量稳定性。

2402_83344867的博客 387
上一篇: printf 与 cout 的性能差异与混用陷阱:sync_with_stdio 到底是什么
下一篇: C++ 错误处理策略:异常 vs 错误码 vs expected 的真实取舍
无名猿
博客等级 码龄10年 61粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值