zalloc: 在你的 C 代码中使用 Zig 分配器
摘要
zalloc 将 C 模块中的 malloc、calloc、realloc 和 free 替换为 Zig 分配器,从而在 C 代码中实现 Zig 风格的内存管理。
<p><a href="https://lobste.rs/s/lurkvp/zalloc_use_zig_allocators_your_c_code">评论</a></p>
查看缓存全文
缓存时间: 2026/06/08 11:17
D-Berg/zalloc
来源:https://github.com/D-Berg/zalloc
Zalloc
在一个C模块中用Zig分配器替换malloc、calloc、realloc和free。
使用
zig fetch --save git+https://github.com/D-Berg/zalloc.git
// build.zig
const zalloc = @import("zalloc");
pub fn build(b: *std.Build) !void {
//...
// 将其添加为依赖
const zalloc_dep = b.dependency("zalloc", .{
.optimize = optimize,
.target = target,
});
// 示例C库(在此感谢md4c)
const md4c_mod = b.addModule("md4c", .{
.target = target,
.optimize = optimize,
.link_libc = true,
});
// 这将覆盖C模块中所有C源文件的malloc、calloc、realloc和free,
// 且只会影响该模块。
zalloc.infect(md4c_mod);
// 将zalloc导入并链接到你的可执行文件
exe_mod.addImport("zalloc", zalloc_dep.module("zalloc"));
exe_mod.linkLibrary(zalloc_dep.artifact("zalloc"));
}
// main.zig
const zalloc = @import("zalloc");
pub fn main(init: std.Io.Init) !void {
// 指定C库将使用的分配器
// 在调用任何C函数之前执行此操作
// 如果忘记,分配将返回null。
zalloc.allocator = init.gpa;
zalloc.io = init.io;
// ...
// 现在md4c将使用Zig的调试分配器。
const rc = md4c.md_html(
markdown.ptr,
@intCast(markdown.len),
processHtml,
null,
md4c.MD_FLAG_COLLAPSEWHITESPACE,
0,
);
if (rc != 0) return error.FailedToParseMarkdown;
}
相似文章
Zig 的数组结构体 (2024)
说明 Zig 的 comptime 和类型反射如何支持创建像 MultiArrayList 这样的数组结构体 (SoA) 数据结构,从而提升高性能应用中的缓存性能。
Zig ELF 链接器改进开发日志
新的 Zig ELF 链接器现在支持外部库和 C 源码的快速增量编译,在 x86_64 Linux 上能够实现毫秒级重建。
用 Zig 写一个 C 编译器
一位开发者记录了用 Zig 语言、按照 Nora Sandler 的教程系列构建名为 paella 的 C 编译器的全过程。
Zig 示例教程
通过带注释的示例,对 Zig 编程语言进行实践性介绍,涵盖从基础到高级的主题。灵感来源于 Go by Example。
构建系统重构
Zig 构建系统已经重构,将配置器和制造器进程分离,支持缓存、发布模式编译,并且'zig build'命令速度提升高达90%。这一变化提高了性能,并允许构建系统在不减速的情况下增加功能。