高级主题 — comptime、线程与 C 互操作¶
这一章把 Zig 从「语言」升级为「世界观」,三件事:comptime(编译期即主场)、 线程(裸 OS 并发,无托儿所)、C 互操作(ABI 是共同语法,双向调用)。 原书定位:入门概览,每个主题「够你认出全貌、激起深挖的欲望」,不是终局教材。
1. 这一章讲什么¶
链条位置:前面所有章节的「编译期」线索(第 4 章 inline for、第 8 章 anytype、 第 11 章构建选项)在这里收拢成系统知识;线程和 C 互操作则是系统级语言的两张 「出门证」。读完你能:读懂标准库泛型容器的实现思路、写出有保护的并发计数器、 在 Zig 里调 C 函数。
2. 顶层全景¶
comptime 编译期(树遍历解释器,能操作类型)vs 运行期(原生机器码)
type 是编译期值 → type function 返回类型 → 泛型的真身
反射三件套:@TypeOf / @typeInfo / @Type
anytype = 鸭子类型占位符;五个常见错误有标准解法
线程 spawn/join;Mutex(保镖)vs atomic(猎豹);三个坑:竞争/死锁/生命周期
C 互操作 ABI 语法书;@cImport 进、export+callconv(.C) 出;
extern struct 对齐布局;[*c]T 是危险品
图说:三块彼此独立,共享同一个词——「显式」。
主线例子(comptime 区):编译期素数表——generatePrimes(10000) 在编译期跑完,
产物直接烤进二进制,运行时零成本;代价是撞默认「分支配额」,要 @setEvalBranchQuota
显式加预算1。
3. comptime:时间机器¶
3.1 基本动作¶
comptime 表达式 强制在编译期求值;comptime { ... } 是编译期块;
comptime 参数 把「这个值必须编译期已知」写进函数签名。
经典收益三件套:预计算(comptime complex_calculation(1234) 把结果烤进二进制)、
编译期断言(comptime { assert(array_size > 0) }——不过就编不过)、
编译期报错(@compileError("x must be non-negative")——签名级的参数校验)2。
comptime_int 是特殊的无限精度整数类型:无固定大小、可强转成任何整数/浮点,
但只能在编译期用——const my_number = 1234; 推断出来就是它3。
3.2 双重身份:两部 Zig¶
原书的核心图景,照单接住4:
| 编译期 Zig | 运行期 Zig | |
|---|---|---|
| 执行者 | 树遍历解释器(逐分支分析) | 原生机器码 |
| 能做什么 | 操纵类型、复杂计算、约束校验 | 跑得快、碰硬件、响应外部事件 |
| 像什么 | 带静态类型安全的动态脚本语言 | 真正的系统语言 |
黄金法则:comptime 函数的所有参数必须编译期已知——
factorial(5) 行(5 是常量),factorial(user_input) 不行(运行期值)5。
3.3 type 与 type function:泛型的真身¶
type 是一个特殊的编译期值:它代表类型本身,不能当运行期值用。
原书给了三条「为什么只允许编译期」的理由:类型相关操作全部在编译期解析,
杜绝运行期类型错误;编译期代码会被优化掉,二进制更瘦;编译期代码和运行期
代码一眼可分,清晰度有保33。
用它做参数,函数就能「返回类型」:
fn FixedArray(comptime T: type, comptime size: usize) type {
return [size]T; // 返回一个数组类型
}
const IntArray5 = FixedArray(i32, 5); // = [5]i32,是一个类型
这就是 Zig 泛型的全部机制——没有 generics 关键字,type function 就是泛型。
std.ArrayList 本身就是一个 type function(收一个元素类型,返回一个列表类型)6。
原书的 Pair(T) 例子还示范了「type function 返回的结构体可以自带方法」7。
反射三件套:@TypeOf(表达式) 问类型(多参数时返回 peer type);
@typeInfo(T) 拿类型的结构化元数据(std.builtin.Type 标签联合,可查
「它是不是整数、有哪些字段」);@Type(元数据) 反向构造类型——
原书的例子把 i32 的位宽加 8,造出一个 i408。
三者合用的顶点:generateStruct(字段名数组, 字段类型数组) 在编译期
凭空拼出一个结构体类型——数据库模型、API 响应体可以不用手写9。
3.4 anytype:鸭子类型占位符¶
fn add(a: anytype, b: anytype) @TypeOf(a)——类型检查推迟到调用点:
你对参数做的操作(这里是 +)就是它的隐式接口,编译器在每个调用处单独验证。
这叫鸭子类型(「能像鸭子叫就当鸭子用」),但检查发生在编译期,不是运行期10。
anytype 只能用于函数参数(它不是真类型,不能声明变量)11。
原书列了五个地雷及标准排法,两个最值钱的:
- 该用
type的地方用anytype(比如comptime T: anytype再当类型用)—— 记住:要「操纵类型本身」用 type,要「接受任何值」用 anytype; - 按类型做运行期分支(
if (T == i32))——类型信息只存在于编译期, 正解是switch (@TypeOf(value)) { i32 => ..., else => @compileError(...) }12。
3.5 主线例子:编译期素数表与分支配额¶
const prime_lookup_table = comptime blk: {
@setEvalBranchQuota(50000); // 显式提高编译期「预算」
break :blk generatePrimes(10000); // 编译期跑完筛法,结果进二进制
};
分支配额(evaluation branch quota) 是编译器的断路器:一个 comptime 块里
循环和递归的「回跳次数」有上限,超限报错 evaluation branch quota reached——
没有它,一个写错的 comptime 死循环会冻结编译器本身13。
@setEvalBranchQuota 只对所在作用域生效(局部的、显式的,一贯的 Zig 哲学),
而且「你几乎不会主动用它——是编译器报配额错时你才来调」14。
4. 线程:裸的,才是真的¶
4.1 spawn 与 join¶
std.Thread.spawn(.{}, func, .{参数}) 起线程;join() 等它结束——
不 join,主线程可能先行退出,子线程半途成为野线程15。
4.2 共享数据:Mutex 与 atomic¶
两班岗的分工(原书比喻精准):
std.Thread.Mutex(保镖) |
std.atomic.Value(猎豹) |
|
|---|---|---|
| 保护什么 | 复杂共享结构(链表、树)、多步复合操作 | 简单独立变量(计数器、标志) |
| 怎么做 | lock → 操作 → unlock(defer 保底) | 原子指令直接改,不阻塞 |
| 开销 | 大(线程挂起/唤醒) | 小 |
Mutex 例:lock(); defer unlock(); counter += 1;——unlock 用 defer 兜底,
panic 也不留锁16。atomic 例:counter.fetchAdd(1, .seq_cst),
.seq_cst(顺序一致性)保证所有线程看到一个全序17。
4.3 三个坑与线程池¶
原书的排障三咒18:
- 数据竞争——两线程抢同一数据没裁判;解法:共享数据一律 mutex,没有例外;
- 死锁——A 拿着 B 的锁、B 拿着 A 的锁,对峙;解法:全局锁序,永远按同一顺序上锁;
- 生命周期——线程还在用,数据已被 free;解法:父线程 join 完再清理, 「你分配的,你参加它的葬礼」。
性能面:裸线程不免费,多了会撑爆系统;线程池——固定 N 个工人循环接任务, 原书给了 5 工人跑 10 任务的批处理示例(输出顺序不定,正是并发的本色)19。
5. C 互操作:共同的语法是 ABI¶
5.1 ABI:二进制层的语法书¶
ABI(应用二进制接口) 规定:数据在内存里的排布(大小、对齐、偏移)、
符号命名、函数调用的约定(参数怎么传、栈谁清)。稳定的 ABI 让「不同编译器、
不同机器上分别编译」的库和可执行文件能一起工作——这是一切 FFI
(外部函数接口)的地基。Zig 内部不用稳定 ABI,但它的 extern 声明借 C 的 ABI,
所以对 C(以及所有和 C 打过交道的语言)说一口流利的「C ABI」20。
5.2 Zig 调 C:@cImport¶
const c = @cImport({
@cInclude("stdio.h");
@cInclude("time.h");
});
pub fn main() void {
_ = c.printf("Zig says: Hello from C's %s!\n", "printf");
...
}
@cImport 是「C 头文件的巴别鱼」:喂它头文件,它吐出 Zig 声明,
c.printf 像原生 Zig 一样调21。因为用了 libc,编译要 -lc
(zig run -lc cimport.zig);走构建系统则在 build.zig 里 exe.linkLibC()22。
三个配套内建:@cInclude(加头文件)、@cDefine/@cUndef(定义/取消宏)。
看不动一段 C?zig translate-c 把 C 源码翻成(大致可读的) Zig——
罗塞塔石碑,理解 C 代码的起点23。
5.3 C 调 Zig:export + callconv(.C)¶
三个部件各管一件事:export(第 5 章的名字)让函数对外可见;
callconv(.C) 让 Zig 按 C 的调用约定传参——忘了它就是烟花秀:
Zig 默认用自己的调用约定,C 听不懂24;
[*:0]const u8 是哨兵终止的多项指针,精确表达「C 风格字符串,以 0 结尾」,
比 C 的 char* 多一层类型保证25。C 侧照常 extern uint32_t
count_words(const char *str); 声明后直调26。
5.4 布局外交:extern struct、对齐、packed¶
普通 Zig struct 的内存布局听编译器的(字段可能重排);和 C 交换数据必须用
extern struct——向 C 的 ABI 布局规则宣誓效忠,否则字段错位就是
国际事件27。对齐是 CPU 的挑食:4 字节类型喜欢待在 4 的倍数地址,
喂错了轻则慢、重则崩;Zig 用 align 关键字定制28。
packed struct(第 8 章见过)在这里补完了动机:普通结构体为对齐塞
padding(u8 + u32 可能占 8 字节而不是 5),packed 把 padding 全删掉、
逐位压缩——网络协议和硬件接口的刚需,代价是非对齐访问的罚金和偶发的编译器 bug29。
packed 世界里还有一把配套钥匙:bit-aligned pointer。字段按位压缩后, 「指针按字节对齐」的默认假设失效,要精确访问某个逐位字段(比如 packed struct 里的单个 bool),得靠 bit 对齐的指针按 bit 偏移导航——原书把它比作 专用开锁器,没有它,从紧紧打包的字节流里抠单个 bit 就是摸黑操作;原书列的 低层编程黄金规则里专门有一条「掌握 bit-aligned pointer」34。
5.5 [*c]T:几乎不该碰的指针¶
C 指针 [*c]T 的四大乱象:不在乎对齐、可以是空(null)、可以和整数随意互转、
可强转成其他指针——每一样都在拆 Zig 指针安全的台。它存在的唯一正当理由:
翻译 C 代码时必须匹配 C 的指针语义。结论(原书):自动翻译产物之外,
「几乎永远不要在 Zig 代码里直接用 [*c]T」;必须和 C 裸指针打交道时,
尽快转成 *T/[*]T/[]T 并补上 null 与对齐检查30。
判断(我们的,不是书里的): 这一节的实用读法是「翻译层是脏的,尽快洗干净」。 和 Rust 的 FFI 哲学( unsafe 块要最小化、封装成安全 API)同构—— Zig 只是没有 unsafe 关键字把脏区标出来,责任全在约定。 好消息是工具链帮你:
@cImport生成的声明集中在一点,洗手池就在那里。 如果错,会错在: 某些 C 头文件的宏和位域翻不过去,@cImport 会静默给出 近似物——翻译结果要抽验,不能全信。
荣誉提名:zig cc / zig c++——不只是 Clang 的包装,集成进构建系统和缓存,
单装一个 Zig 就能给 C/C++ 做全平台交叉编译31。第 1 章「Maintain with Zig」
的硬件,到这里齐了。
6. 作者的判断与证据¶
可核的: 全部 API 与输出(素数表、线程池输出顺序不定、C 互操作两端代码)、 五个 anytype 地雷的报错形态、[*c]T 的四大性质11930。
立场: 「comptime 是哲学不是特性」14;线程一节明说这是「概览, 深挖要另开一本书」;C 一节对三家语言的比喻(Rust 拆迁、Python 转租、 Zig 翻新)是作者立场鲜明的类比,不是中立测评——但「Zig 走增量互操作」 的事实判断与第 1 章一致。
7. 边界与局限¶
| 缺什么 | 说明 |
|---|---|
| comptime 的字面量/容器操作没系统讲 | ++、.{}、字符串操作在 comptime 的完整能力,没列表 |
| 线程没有讲条件变量、channel | Condition、std.event(当时实验性)缺席;并发原语只有 mutex 和 atomic |
| async/await 完全没提 | 写作时 Zig 的 async 处于被移除后重做阶段,原书避开了这个雷区——读者要知道这门课在外面还欠着 |
| C 互操作没讲 build.zig 里链 C 库全流程 | addCSourceFile、addLibraryPath 等只在别处一闪而过 |
@cImport 的失败模式没讲 |
宏/位域翻译的限制、何时必须手写 extern 声明 |
| 全部没有练习(除指向仓库的指针) | 本章的「practice makes perfect」只是指路到 GitHub 的泛型 Stack 教程32 |
8. 可带走的¶
主线例子一行: comptime { @setEvalBranchQuota(50000); break :blk
generatePrimes(10000); } —— 编译期跑完重活,零运行时成本,预算撞墙就显式加。
- comptime 三件事:预计算、编译期断言、@compileError 参数校验; comptime_int 是只活在编译期的无限精度整数;
- 双重身份:编译期是树遍历解释器(能操纵类型),运行期是原生机器码; comptime 函数的所有参数必须编译期已知;
- 泛型 = type function:
fn Foo(comptime T: type) type;std.ArrayList就是;type 是编译期值,不能当运行期值; - 反射三件套:
@TypeOf(问)、@typeInfo(拆)、@Type(造); 合用可编译期拼出结构体; - anytype = 鸭子类型 + 编译期检查;只用于参数; 按类型分支用 comptime switch,别用运行期 if;
- 分支配额是编译器断路器;
@setEvalBranchQuota局部加预算, 编译器报配额错时才用; - 线程:spawn 后必须 join;Mutex 护复杂结构、atomic 管简单计数; 三坑:竞争(mutex 无例外)、死锁(全局锁序)、生命周期(join 完再清理); 线程池节制资源;
- C 互操作:ABI 是共同语法;
@cImport进、export fn + callconv(.C)出;extern struct对齐 C 布局;packed 逐位压缩;[*c]T是危险品,尽快洗掉; zig cc/zig c++顺手就是全平台 C/C++ 交叉编译器;- 本章是概览:async、条件变量、cImport 的坑,都是「出了这本书要补的课」。
9. 原文地图¶
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| comptime 基础与 comptime_int | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:45(搜「duct tape」) · text/20-ch12-chapter-12-sophisticated-topics.txt:70(搜「inferred to be」) |
| comptime 块与 @compileError | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:107(搜「comptime {」) · text/20-ch12-chapter-12-sophisticated-topics.txt:125(搜「@compileError」) |
| 双重身份(树遍历解释器) | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:169(搜「tree-walking」) |
| 黄金法则 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:203(搜「golden rule」) |
| type 超类型 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:237(搜「meta-type」) |
| type function(FixedArray/Pair) | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:271(搜「FixedArray」) · text/20-ch12-chapter-12-sophisticated-topics.txt:295(搜「Pair」) · text/20-ch12-chapter-12-sophisticated-topics.txt:336(搜「ArrayList type is a type function」) |
| 反射三件套 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:351(搜「@TypeOf: The detective」) · text/20-ch12-chapter-12-sophisticated-topics.txt:377(搜「@typeInfo(i32)」) · text/20-ch12-chapter-12-sophisticated-topics.txt:410(搜「i40」) |
| generateStruct | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:426(搜「generateStruct」) |
| anytype 与鸭子类型 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:481(搜「Swiss Army knife」) · text/20-ch12-chapter-12-sophisticated-topics.txt:496(搜「Duck typing」) |
| 五个地雷 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:521(搜「Mistake 1」) · text/20-ch12-chapter-12-sophisticated-topics.txt:574(搜「processValueBetter」) · text/20-ch12-chapter-12-sophisticated-topics.txt:584(搜「everything should be anytype」) |
| 分支配额 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:706(搜「circuit breaker」) · text/20-ch12-chapter-12-sophisticated-topics.txt:747(搜「@setEvalBranchQuota(50000)」) |
| spawn/join | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:792(搜「std.Thread.spawn」) · text/20-ch12-chapter-12-sophisticated-topics.txt:795(搜「thread.join」) |
| Mutex 与 atomic | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:825(搜「bouncer of your nightclub」) · text/20-ch12-chapter-12-sophisticated-topics.txt:882(搜「fetchAdd」) |
| 并发三坑 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:920(搜「Data race」) · text/20-ch12-chapter-12-sophisticated-topics.txt:926(搜「Deadlock」) · text/20-ch12-chapter-12-sophisticated-topics.txt:933(搜「Lifetime issues」) |
| 线程池 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:960(搜「num_workers = 5」) |
| ABI 定义 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1050(搜「rulebook」) |
| @cImport 与 -lc | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1067(搜「cImport」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1099(搜「-lc」) |
| translate-c | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1118(搜「Rosetta Stone」) |
| export + callconv(.C) | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1161(搜「count_words」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1189(搜「magic incantation」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1227(搜「fireworks」) |
| extern struct / 对齐 / packed | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1237(搜「diplomatic passport」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1248(搜「picky eater」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1264(搜「invisible padding」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1284(搜「lockpicks」) |
| [*c]T 的警示 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1312(搜「wild west」) · text/20-ch12-chapter-12-sophisticated-topics.txt:1336(搜「almost never」) |
| zig cc 荣誉提名 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:1348(搜「zig cc and zig c++ commands」) |
| 本章概览定位 | Chapter 12: Sophisticated Topics | text/20-ch12-chapter-12-sophisticated-topics.txt:7(搜「introductory overview」) |
-
出处:「Chapter 12: Sophisticated Topics」第 723–753 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:725,搜「generatePrimes」;text/20-ch12-chapter-12-sophisticated-topics.txt:747,搜「@setEvalBranchQuota(50000)」)。 ↩↩ -
出处:同章第 86–153 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:92,搜「crunch the numbers」;text/20-ch12-chapter-12-sophisticated-topics.txt:119,搜「parachute」;text/20-ch12-chapter-12-sophisticated-topics.txt:125,搜「@compileError」)。 ↩ -
出处:同章第 65–84 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:72,搜「chameleon」)。 ↩ -
出处:同章第 162–201 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:169,搜「tree-walking」;text/20-ch12-chapter-12-sophisticated-topics.txt:182,搜「speed demon」)。 ↩ -
出处:同章第 203–225 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:204,搜「custom-made suit」;text/20-ch12-chapter-12-sophisticated-topics.txt:222,搜「Invalid call」)。 ↩ -
出处:同章第 333–338 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:336,搜「ArrayList type is a type function」)。 ↩ -
出处:同章第 263–331 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:271,搜「FixedArray」;text/20-ch12-chapter-12-sophisticated-topics.txt:295,搜「fn Pair」)。 ↩ -
出处:同章第 343–412 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:351,搜「@typeOf: The detective」;text/20-ch12-chapter-12-sophisticated-topics.txt:377,搜「@typeInfo(i32)」;text/20-ch12-chapter-12-sophisticated-topics.txt:410,搜「i40」)。 ↩ -
出处:同章第 423–475 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:426,搜「generateStruct」;text/20-ch12-chapter-12-sophisticated-topics.txt:451,搜「MyStruct = generateStruct」)。 ↩ -
出处:同章第 481–514 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:481,搜「Swiss Army knife」;text/20-ch12-chapter-12-sophisticated-topics.txt:496,搜「Duck typing」)。 ↩ -
出处:同章第 504–511 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:504,搜「only allowed in function parameters」)。 ↩ -
出处:同章第 516–692 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:521,搜「Mistake 1」;text/20-ch12-chapter-12-sophisticated-topics.txt:574,搜「processValueBetter」;text/20-ch12-chapter-12-sophisticated-topics.txt:584,搜「everything should be anytype」)。 ↩ -
出处:同章第 700–710 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:706,搜「circuit breaker」)。 ↩ -
出处:同章第 711–756 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:720,搜「almost never use this function」)。 ↩↩ -
出处:同章第 775–803 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:792,搜「std.Thread.spawn」;text/20-ch12-chapter-12-sophisticated-topics.txt:801,搜「might exit before」)。 ↩ -
出处:同章第 809–866 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:825,搜「bouncer of your nightclub」;text/20-ch12-chapter-12-sophisticated-topics.txt:833,搜「Unlock even if you panic」)。 ↩ -
出处:同章第 867–908 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:882,搜「fetchAdd」;text/20-ch12-chapter-12-sophisticated-topics.txt:905,搜「seq_cst」)。 ↩ -
出处:同章第 917–943 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:920,搜「Data race」;text/20-ch12-chapter-12-sophisticated-topics.txt:926,搜「Deadlock」;text/20-ch12-chapter-12-sophisticated-topics.txt:930,搜「global locking order」;text/20-ch12-chapter-12-sophisticated-topics.txt:938,搜「funeral」)。 ↩ -
出处:同章第 944–1010 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:960,搜「num_workers = 5」;text/20-ch12-chapter-12-sophisticated-topics.txt:993,搜「You should see a result」)。 ↩↩ -
出处:同章第 1049–1060 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1050,搜「rulebook」;text/20-ch12-chapter-12-sophisticated-topics.txt:1056,搜「extern declarations」)。 ↩ -
出处:同章第 1062–1094 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1067,搜「cImport」;text/20-ch12-chapter-12-sophisticated-topics.txt:1075,搜「c.printf」)。 ↩ -
出处:同章第 1096–1110 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1099,搜「-lc」;text/20-ch12-chapter-12-sophisticated-topics.txt:1108,搜「linkLibC」)。 ↩ -
出处:同章第 1112–1127 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1118,搜「Rosetta Stone」)。 ↩ -
出处:同章第 1145–1228 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1161,搜「count_words」;text/20-ch12-chapter-12-sophisticated-topics.txt:1189,搜「magic incantation」;text/20-ch12-chapter-12-sophisticated-topics.txt:1227,搜「fireworks」)。 ↩ -
出处:同章第 1185–1188 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1185,搜「sentinel-terminated pointer」)。 ↩ -
出处:同章第 1197–1221 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1202,搜「extern uint32_t」;text/20-ch12-chapter-12-sophisticated-topics.txt:1207,搜「Word count: 3」)。 ↩ -
出处:同章第 1237–1245 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1237,搜「diplomatic passport」)。 ↩ -
出处:同章第 1247–1254 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1248,搜「picky eater」)。 ↩ -
出处:同章第 1256–1304 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1264,搜「invisible padding」;text/20-ch12-chapter-12-sophisticated-topics.txt:1276,搜「Packed structs eliminate padding」)。 ↩ -
出处:同章第 1306–1343 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1312,搜「wild west」;text/20-ch12-chapter-12-sophisticated-topics.txt:1336,搜「almost never」)。 ↩↩ -
出处:同章第 1345–1355 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1348,搜「zig c++ commands」)。 ↩ -
出处:同章第 762–766 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:764,搜「ch13 folder」)。 ↩ -
出处:同章第 249–257 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:251,搜「Guarantees type safety」;text/20-ch12-chapter-12-sophisticated-topics.txt:253,搜「Maximizes performance」;text/20-ch12-chapter-12-sophisticated-topics.txt:254,搜「Maintains clarity」)。 ↩ -
出处:同章第 1282–1301 段(
text/20-ch12-chapter-12-sophisticated-topics.txt:1284,搜「lockpicks」;text/20-ch12-chapter-12-sophisticated-topics.txt:1300,搜「Master bit-aligned pointers」)。 ↩