从 base 出发:深入理解 Chromium 自研基础库的体系结构与设计哲学(兼谈为什么不直接用 STL)

Chromium源码—base基础库说明 Chromium 基础库概览 Chromium 基础库包括的内容十分繁杂,我把其中的主要部分大致分为以下几类: 1. 容器类型 Chromium 的代码主要使用 STL 容器类型,比如 std::vector,std::list,另外 GCC 和 MSVC 提供的 STL 扩展容器类型 hash_map 和 hash_set 也在 Chromium 中使用,不过统一放在 base 名字空间里... 阅读详情

一、背景:一个跨平台浏览器为什么要重新造“轮子”?

在浏览器开发生态里,Chromium 是当之无愧的“核心内核”。无论是 Google Chrome、Edge、360、Brave,还是大量国产定制浏览器,它们的技术底座几乎都源自 Chromium。

从表面上看,我们很容易把精力放在渲染引擎(Blink)、进程模型、网络模块、Media Pipeline 等“看起来很硬核”的模块上,而忽略掉内核最底层的基础设施 —— base 库。

事实上,如果没有 base 这一层打底,Chromium 很多模块(包括线程系统、IPC 框架甚至 task 调度模型)根本无法运行。
更重要的是,标准 C++ STL 或 Boost 并不能满足 Chromium 巨型跨平台架构在一致性、性能和可维护性上的要求,这也是它“重新造轮子”的根本原因。

本文将从源码层面出发,带你完整理解 base 库是什么、解决了什么问题、主要模块组成、核心设计理念、实际开发场景,以及它的独特价值,希望可以成为你学习 Chromium 内核体系的一个“起始点”。


二、base 库是什么?

2.1 定位

base 是 Chromium 的最底层、最通用的公共库,它 不依赖任何其他模块 却被其他所有模块依赖(net/content/chrome/gin/v8...)。

它提供的是:

  • 通用跨平台工具类(字符串、时间、文件、进程)

  • 线程、任务、事件循环

  • 内存管理封装(智能指针、引用计数、弱指针)

  • 基础容器、安全格式化、日志框架

  • 方便浏览器使用的观察者模式 / callback / Bind

换句话说,它相当于一个大型 C++ 工具库,针对浏览器场景做过深度裁剪与优化。

2.2 为什么不是直接用 STL?
标准库 / BoostChromium 需求
行为在不同 OS 上实现不同需要跨平台行为绝对一致
缺乏线程模型 / 消息循环浏览器大量依赖异步任务
debug 模式性能很差(特别是多线程容器)大型项目开发期间大量使用 debug 构建
部分 API 不支持 UTF-8 字符处理浏览器要处理全球语言
很难对每个细节打补丁Chromium 要求所有基础能力可控

✅ 所以 base 是一种“巨大工程规模 + 跨平台一致性 + 高性能可控”的折中解决方案
❌ 它不是为了“重复造轮子”而造轮子


三、整体结构全览

从功能层面,base 可以大致划成下面几个子域:

功能域典型文件夹 / 类
智能指针与内存memory/(RefCounted、WeakPtr、scoped_refptr)
线程 & 任务调度threading/(Thread、ThreadPool、TaskRunner)
消息循环message_loop/(MessageLoop、RunLoop)
字符串处理strings/(UTF8→UTF16、string_util)
容器containers/(flat_map、circular_deque)
时间日期time/(Time、TimeDelta、Timer)
文件系统files/(File、FilePath、FileUtil)
日志logging/(LOG/ CHECK/ DCHECK)
JSONjson/(base::Value、JSONReader/Writer)
观察者observer_list.h / ObserverListThreadSafe
系统/进程信息process/、sys_info/
数据统计metrics/(Histogram、UMA)
IPC/SOCKETsync_socket/

下面我们从几个关键子模块深入展开。


四、核心子模块分析

4.1 memory:智能指针、引用计数、WeakPtr

Chromium 拒绝使用裸指针,因此 base 提供了三种常用内存管理手段:

类典型用途
RefCounted引用计数对象,适用于跨线程共享资源
WeakPtr避免异步回调中访问已销毁对象
scoped_refptr智能指针封装,对应 RefCounted 对象

例如常见写法:

class MyObject : public base::RefCounted<MyObject> { public: void DoSomething(); private: friend class base::RefCounted<MyObject>; ~MyObject() = default; }; // 使用 scoped_refptr<MyObject> obj = new MyObject();

⚠️ 注意:WeakPtr 必须配合 base::WeakPtrFactory 使用,且只能在创建它的线程销毁。


4.2 threading + message_loop:线程模型与事件分发

Chromium 并不是简单的 “pthread + sleep”,而是实现了一整套可扩展的异步执行模型,其中最核心的是:

模块功能
base::Thread创建一个有自己 MessageLoop 的线程
TaskRunner提供任务投递接口(PostTask / PostDelayedTask)
MessageLoop事件循环 + 消息调度
ThreadPool全局线程池(后台执行任务)

典型使用:

base::Thread my_thread("MyThread"); my_thread.Start(); scoped_refptr<base::TaskRunner> task_runner = my_thread.task_runner(); task_runner->PostTask(FROM_HERE, base::BindOnce(&Foo));

这套机制贯穿于整个浏览器生命周期(I/O 线程 / UI 线程 / DB 线程 / GPU 线程 都是由 base 启动和管理的)。


4.3 containers:自研轻量容器

Chromium 没有完全摒弃 STL,但对以下场景重新实现容器,以提升性能:

base 容器优势与场景
flat_map基于排序数组实现,查询快,内存连续,适合小规模 KV
circular_deque环形缓冲区,频繁入队出队性能好
stack_container小对象直接放在栈上,避免 heap 分配

例如 flat_map 效果如下:

base::flat_map<std::string, int> m = {{"a",1}, {"b",2}};

性能上在 50 个元素以内比 std::map 快很多。


4.4 files & path & sys_info
  • FilePath 专门处理不同平台的目录分隔符

  • ReadFileToString() / WriteFile() 提供统一接口

  • SysInfo::AmountOfPhysicalMemory() 返回系统内存
    → 行为在 Windows / Linux / macOS 上完全一致


4.5 logging 与 CHECK/DCHECK

在 Chromium 项目中你会非常频繁地见到这些宏:

LOG(INFO) << "Something happened"; CHECK(condition); DCHECK(ptr != nullptr);

区别:

宏含义
LOG始终启用的日志
CHECK失败直接崩溃(发布版本也有效)
DCHECK仅在 Debug 构建中有效

五、设计哲学总结

关键词表现
跨平台一致性所有模块对不同 OS 做统一抽象(FilePath / SysInfo / Thread)
性能可控自研容器 / 回收机制 / 减少 STL 波动带来的抖动
适配浏览器模型专门的 MessageLoop + TaskRunner 支撑多进程异步调度
长期可维护性统一宏 / 接口风格 / 智能指针规范

这也是为什么“base” 被视作浏览器内核的“地基”。越往上的模块越轻,但它必须足够稳固,否则整个架构就会崩。


六、在实际开发中的典型使用场景

场景base 中对应功能
跨线程投递任务PostTask(FROM_HERE,...)
延迟或重复任务base::Timer / base::RepeatingTimer
安全字符串拼接base::StringPrintf
JSON 配置加载base::JSONReader::Read()
系统级信息(CPU/内存)base::SysInfo
多线程日志调试LOG(…) << …;
避免异步回调悬空base::WeakPtr + WeakPtrFactory

七、如何进一步阅读 base 源码(推荐阅读路径)

步骤模块目标
①base/memory理解 RefCounted、WeakPtr 实现和引用模型
②base/threading阅读 Thread/ThreadPool/TaskRunner 工作流程
③base/message_loop异步事件循环扩展(MsgPump 、MessageLoop::Run)
④base/containers感受自研容器设计思路
⑤base/logging日志系统实现,理解 CHECK/DCHECK crash 流程
⑥base/task宏观理解整个 TaskScheduler 如何在浏览器内分发任务

📌 建议结合一个实际页面 WebUI 逻辑,例如 chrome://version,反着追踪它用到的 base API,会更快建立“感知能力”。


八、总结与个人体会

“为什么 Chromium 要封装一套自己的基础库?”
—— 因为它不是普通项目,它需要在 几十年生命周期 + 数十个平台 + 上千万行代码 + 数千开发者并行协作 的体系中保持一致性和可维护性。

base 提供的不是简单的工具集合,而是一组被严格校验过的“架构支点”。

核心认识
✅ 它支撑了浏览器的线程模型、任务调度、安全调用和设备无关性
✅ 它保证了跨平台行为完全一致
✅ 它将复杂体系拆成了可维护、可测试的模块单位
✅ 它提升了性能,并避免了 STL 在大型工程场景的不可控因素
✅ 它是进入 Chromium 内核体系的最佳入口

如果你想真正理解浏览器内核架构,从 base 开始绝对是一个正确的打开方式。

深入理解Electron一Electron架构介绍 Electron和众多类似的产品目标非常简单,他们将chromium(这里不同的框架选择不同,比如Tauri选择了原生的WebView,而WebView2选择了Edge内核)和Node.js(这里不同框架采取策略也不同,比如Webview2不提供默认的运行时,而Tauri选择了Rust等等)利用C++等原生语言集成起来,提供了一整套基于Web的运行环境,并提供了与底层OS交互的便捷API,目的就是为了让大家使用Web的技术栈去开发客户端原生应用,从而实现不同操作系统之间的跨平台开发。 阅读详情

相关推荐

C++程序员进阶指南:从初级到高级的核心能力培养

C++作为高性能编程语言的核心工具,其学习路径需要经历从语法掌握到系统设计的思维转变。理解STL容器的时间复杂度特性、迭代器失效机制等底层原理,是构建高效程序的基础。在多线程编程场景中,正确使用互斥锁、条件变量等并发工具能显著提升程序稳定性。通过GDB调试工具和Valgrind内存检测等工程实践,开发者可以快速定位性能瓶颈和内存问题。本文以日志系统设计为例,展示了中级程序员需要考虑的线程安全、异步队列等关键因素,同时探讨了现代C++特性如移动语义、lambda表达式在实际项目中的应用价值。

weixin_33720078的博客 316

chromium中的base库 ipc进程间通信 ChannelProxy分析

1. chromium进程通信的基本模式 进程间通信,叫做IPC(Inter-Process Communication),在Chrome不多的文档中,有一篇就是介绍这个的,在这里。Chrome最主要有三类进程,一类是Browser主进程,我们一直尊称它老人家为老大;还有一类是各个Render进程,前面也提过了;另外还有一类一直没说过,是Plugin进程,每一个插件,在Chrome中都是以进程的形式呈现,等到后面说插件的时候再提罢了。Render进程和Plugin进程都与老大保持进程间的通信,Rende.

sway913的博客 2180

C++基础课核心模块深度解析:从语法到内存管理的系统学习指南

C++作为一门支持面向对象、泛型编程和底层内存操作的系统级语言,其核心价值在于对计算机系统原理的深刻揭示。通过理解数据类型、内存对齐、指针与引用等底层机制,开发者能够编写出高效、安全的代码,这是其在高性能计算、游戏引擎、操作系统等领域的应用基础。内存管理是C++编程的关键环节,涉及手动分配释放与智能指针等现代技术,直接关系到程序的稳定性和性能。面向对象编程中的封装、继承、多态等思想,以及模板与STL提供的泛型编程能力,共同构成了管理复杂软件系统的工程方法。本文以经典C++课程为蓝本,结合**内存管理**和*

weixin_33981932的博客 452

Chromium base库介绍

AtExitManager 类似于linux下的atexit,注册退出清理函数,不过base库的实现机制是利用了C++的RAII。void exit_first(void *data) { LOG(INFO) << "first"; }void exit_last(void *data) { LOG(INFO) << "second"; }void exit_task(void *data) { L

zyfforlinux 7376

C++入门指南:从环境搭建到面向对象编程与内存管理

编程语言是软件开发的基石,其核心在于将人类逻辑转化为机器可执行的指令。C++作为一种静态类型、编译型语言,其设计哲学强调性能、控制与灵活性,通过直接内存操作和硬件抽象能力,在系统编程、游戏引擎、高频交易等对性能要求极高的领域占据统治地位。理解C++的内存模型、面向对象特性和标准模板库(STL),是掌握其技术价值的关键。这些特性使得开发者能够构建高效、可控的大型软件系统。本文以环境搭建、核心语法、面向对象编程和内存管理为主线,结合智能指针、STL容器等现代C++实践,为初学者提供一条从基础到实战的清晰学习路径

weixin_34033624的博客 382

C++初学者实战进阶:八大开源项目深度解析与学习路径

C++编程语言作为系统级开发的核心工具,其学习路径从语法掌握到项目实战是关键跨越。理解计算机科学基础原理,如数据结构、算法、内存管理和操作系统交互,是构建复杂软件系统的基石。在工程实践中,网络编程、并发处理和性能优化等技术价值尤为突出,广泛应用于后端服务、游戏开发、高频交易等核心场景。本文聚焦于通过精选开源项目进行实战学习,其中TinyWebServer展示了事件驱动和线程池在高性能网络服务中的应用,而simdjson则揭示了利用SIMD指令集进行数据级并行优化的前沿技术。这些项目覆盖了从I/O多路复用到无

快马扬鞭须努力! 436

Chromium 136 编译指南 Ubuntu篇:构建配置与编译执行(七)

本文系统介绍了Chromium136编译构建的技术实现过程。首先分析了GN元构建系统的创新设计(声明式语法、惰性求值等)和Ninja引擎的高效调度算法(并行编译、负载均衡),然后详细讲解了构建参数的配置优化技巧(开发环境专用配置、编译加速参数),并提供了分阶段编译策略和常见问题诊断方法。通过7个阶段的系统工作,开发者不仅能成功编译Chromium136,更能掌握大型项目构建管理的核心技术。文章最后强调持续参与社区和维护开发流程的重要性,为浏览器技术探索奠定基础。

守城小轩的技术窝棚 1130

C++面试核心:内存管理、多线程与性能优化实战解析

C++作为一门贴近系统底层的编程语言,其核心价值在于对计算机资源的精细控制和高性能计算能力。理解其底层原理,如内存模型、对象生命周期和多态机制,是掌握这门语言的关键。从技术价值看,这种精细控制使得C++在系统软件、游戏引擎、高频交易等对性能和资源敏感的场景中不可替代。在工程实践中,内存管理是C++编程的基石,涉及指针、智能指针的选用哲学,以及如何避免内存泄漏和悬空指针。同时,随着多核处理器普及,并发编程成为必备技能,需要掌握线程安全、互斥锁、原子操作及C++内存模型来编写高效可靠的多线程代码。本文聚焦C++

weixin_33700350的博客 452

C与C++深度对比:从哲学差异到工程实践的核心分野

在系统级编程领域,类型系统和内存管理是构建可靠软件的基础。类型系统通过编译时检查确保数据操作的安全性,而内存管理则直接关系到程序的性能和稳定性。C语言采用松散的类型系统和完全手动内存管理,赋予程序员极高的控制权,但也带来了安全风险。C++通过严格的类型系统、引用、模板以及RAII(资源获取即初始化)和智能指针等机制,在保持高性能的同时大幅提升了开发安全性与效率。这些核心原理的价值在于,它们使得构建大型、复杂且易于维护的系统成为可能,广泛应用于操作系统、游戏引擎、嵌入式设备和高性能服务器等场景。本文聚焦于C与

weixin_33923762的博客 340

从C到C++:编程思维跃迁与核心特性实战指南

编程语言的发展从过程式向多范式演进,其核心在于抽象层次的提升与资源管理的自动化。面向对象编程通过封装将数据与行为绑定,实现了更高的模块化与代码复用;RAII(资源获取即初始化)技术则通过对象生命周期自动管理资源,从根本上解决了内存泄漏等顽疾。这些技术价值体现在构建大型、可维护软件系统时,能显著降低复杂度与错误率。应用场景涵盖系统软件、游戏开发、高频交易等对性能与可靠性要求极高的领域。本文聚焦于C++的面向对象特性和RAII机制,为有C语言背景的开发者提供平滑过渡的思维框架与实践路径,帮助掌握现代C++的核心

chubaisheng8627的博客 360

base基础库

base基础库是从Chromium 源码中提取,实现跨平台的基础库。

shunzi5201314a的专栏 607

Chromium 138 编译指南 Ubuntu篇:构建配置与编译执行(七)

Chromium 138编译构建技术解析 本文系统介绍了Chromium 138浏览器的编译构建过程,重点解析了其技术架构和实施细节。构建系统采用GN+Ninja双层架构,GN作为元构建系统负责处理25万+编译单元的依赖关系,通过DSL语言实现跨平台适配;Ninja则专注于执行优化,将编译时间缩短至数小时。文章详细阐述了构建配置生成、参数优化、编译执行策略及问题诊断方法,包括内存优化、并行编译调度等关键技术。通过7个阶段的系统工作,开发者可完成从源代码到完整浏览器的构建过程,掌握现代超大型项目的编译技术精髓

守城小轩的技术窝棚 929

chromium-base:修剪过的 Chromium 基础库,基于 zcbenzbase-minimal 和 mini_chromium,但有更多有用的东西。 目前仅在 linux 和 windows 下工作

最小基数 修剪 Chromium 的基础库,只需将base.gyp:base添加到您的base.gyp:base文件即可使用它们。 建造 $ cd chromium-base $ gyp --depth=. base.gyp -I src/build/common.gypi $ ninja -C out/Debug

C++入门超详细指南:从环境搭建到核心语法与面向对象编程

编程语言是软件开发的基石,其核心在于将人类逻辑转化为机器指令。C++作为一门支持多种编程范式(面向过程、面向对象、泛型编程)的编译型语言,其设计哲学强调性能、灵活性与对硬件的直接控制。这种底层控制能力使其在需要极致性能与资源管理的场景中具有不可替代的技术价值,广泛应用于操作系统、游戏引擎、高频交易和嵌入式系统等核心领域。理解C++的内存管理、指针和面向对象机制,不仅是掌握这门语言的关键,也是深入理解计算机系统工作原理的重要途径。本文以**环境搭建**和**核心语法**为切入点,系统性地解析了从编写第一个“H

weixin_34037173的博客 595

数字IC物理验证实战 | 从Calibre LVS报告到Innovus定位的Debug全链路解析

本文详细解析了数字IC物理验证中Calibre LVS报告的Debug全流程,从INCORRECT NETS错误的初探到Innovus定位技巧,提供了实战案例和高效工具的使用方法。重点介绍了Calibre高亮功能、Innovus验证命令以及前后端工具联动的关键策略,帮助工程师快速定位和解决LVS问题,提升物理验证效率。

weixin_30919429的博客 127

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3831

2024年C++程序员成长路线图:从新手到架构师的完整路径

C++作为一种高性能系统编程语言,其核心价值在于对计算机底层原理的深度控制和高性能计算能力。其设计哲学融合了面向对象、泛型和过程式编程范式,通过RAII(资源获取即初始化)等机制实现安全高效的资源管理。在现代软件开发中,C++的技术价值体现在操作系统、游戏引擎、高频交易、数据库等对性能和可靠性要求极高的领域。随着AI基础设施和边缘计算的发展,掌握C++底层原理和大型系统架构能力成为工程师的核心竞争力。本文基于C++11/14/17/20的现代特性,结合多线程编程、智能指针、STL容器等热词,系统梳理了从语言

weixin_33709609的博客 521

Python小白也能搞定!用you-get一键下载B站视频合集的保姆级教程

本文为Python新手提供了使用you-get工具一键下载B站视频合集的完整教程。从环境配置、基础下载操作到高级批量下载技巧,详细介绍了如何利用这个开源工具高效获取视频资源,包括解决常见问题和实用优化建议,帮助用户轻松实现离线学习。

weixin_42544663的博客 458

零基础C++自学指南:从环境搭建到项目实战的完整路径

编程语言学习是掌握计算机科学基础的重要环节,其核心在于理解如何将人类逻辑转化为机器可执行的指令。C++作为一种支持面向对象、泛型编程和底层内存操作的语言,其学习路径需要从基础语法和程序结构入手,逐步深入到核心概念与内存管理。掌握指针、引用、类与对象等概念,是理解程序在计算机中如何运行的关键。这些知识不仅有助于编写高效、可靠的代码,更是进行系统软件开发、游戏引擎构建和高性能计算等领域的基石。对于初学者而言,一个清晰的学习路径和有效的练习方法至关重要。本文基于实际开发经验,重点围绕**环境搭建**和**项目实战

weixin_30781775的博客 435

泰森多面体Voronoi 3D-V5.0 功能介绍

Abaqus Voronoi3D

qq_34840441的博客 3364

【调试记录】GT ip跑aurora 64b66b协议

如果不用,会出现这种情况:自回环测试,数据收发ok.一旦和对方通信,对方接收的就是一堆乱码,因为GT链路发送数据不能是全1或全0,或者长时间的1或0.否则线路容易受到干扰,毕竟线速率10多G,用了加扰和解扰,就可以提高抗干扰能力。64B66B编码,数据输入是64bit,输出是66bit,所以这之间存在着2bit的带宽差,Gearbox 就是用来解决这种差异的,实现方式是:将66bit数据拿出来2bit先存入Gearbox,然后输出64bit.发送同步码或控制数据时,配置成2.2.4 加扰和解扰!

weixin_41246509的博客 1601

C++面试深度指南:从刷题到系统知识,应对米哈游等大厂技术考察

在C++开发领域,掌握语言核心特性和系统底层原理是构建高性能应用的基础。理解虚函数表、智能指针、内存管理等机制,不仅涉及语法层面,更关乎程序运行时效率与资源管理的工程实践。这些知识的技术价值在于,它们直接决定了软件的性能、稳定性和可维护性,是开发游戏引擎、分布式后端、基础软件等复杂系统的关键。在实际应用场景中,如游戏服务器开发或高频交易系统,对C++的深度掌握能帮助开发者优化性能、调试复杂问题。本文围绕C++面试的深度考察,结合**虚函数**和**智能指针**等核心热词,探讨如何超越单纯刷题,构建扎实的知识

weixin_33724659的博客 431

【GlobalMapper精品教程】038:模拟水位上升(洪水淹没分析)案例教程

基于数字高程模型 ( DEM )格网模型,实现给定水深情况下洪水淹没区的计算模型,讨论洪水淹没演进过程可视化实现的关键技术,以三维可视化方式,动态而形象地模拟在指定洪水水位下的洪水淹没演进过程。

智慧空间实验室 2880

C++程序员进阶指南:从语言精通到垂直领域专家的五大高价值方向

在软件工程领域,编程语言是构建数字世界的基石,而C++以其对系统资源的极致掌控和底层硬件的高效访问能力,成为高性能计算、基础设施和实时系统等关键领域的核心技术。其核心原理在于通过直接内存操作、零成本抽象和编译期优化,实现对计算性能的深度挖掘。这一技术价值体现在能够构建操作系统、数据库、游戏引擎、嵌入式系统等高壁垒、高复杂度的核心系统。从应用场景来看,现代C++技术栈已深度融入基础设施研发、音视频处理、物联网、游戏开发及编译器工具链等垂直领域。例如,在基础设施方向,开发者需精通内存管理、无锁数据结构和网络编程

weixin_34293141的博客 639

网络工程师教程第6版(2024年最新版)

本书 根据《网络工程师考试大纲》(2024年审定通过)编写,对网络工程师岗位所要求的主要知 识及应用技术进行了阐述。本书主要内容包括数据通信、局域网、无线通信网、网络互连、网络安全、网络操作系统与应用服务器、组网技术、网络管理、网络规划和设计。本书是参加网络工程师考试的必备教材,也可作为网络工程从业人员学习网络技术的教材或日常工作的参考用书。王涛和严体华编写了第2章、第3章和第4章;网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。

鹿鸣天涯 6901

电路设计仿真软件:Mentor Graphics_(11).MentorGraphics软件操作与技巧

/ 定义自定义仿真命令// 加载设计文件// 运行仿真// 主函数return 1;return 0;// 自定义设计检查// 获取设计中的所有模块// 遍历所有模块// 检查模块名称是否符合规范if (!// 检查模块中的所有引脚if (!// 主函数main() {通过本节的学习,您应该已经掌握了如何在 Mentor Graphics 中进行二次开发,包括使用 Tcl、C++ 和 Python 进行基本和高级操作。

kkchenjj的博客 1636
上一篇: 深入对比:Chromium的base::RefCounted与std::shared_ptr——从线程安全到性能优化
下一篇: Chromium base 库中的 Observer 模式实现:ObserverList 与 ObserverListThreadSafe 深度解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值