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) 数据结构,从而提升高性能应用中的缓存性能。
std.Io.Writer.Allocating 消耗了我所有内存
一篇博客文章揭示了 Zig 的 std.Io.Writer.Allocating 中存在的内存过度分配错误,原因是 `drain` 函数在每个数据切片上错误地预留了 splat 参数的空间,导致内存意外增长。
Zig ELF 链接器改进开发日志
新的 Zig ELF 链接器现在支持外部库和 C 源码的快速增量编译,在 x86_64 Linux 上能够实现毫秒级重建。
用 Zig 写一个 C 编译器
一位开发者记录了用 Zig 语言、按照 Nora Sandler 的教程系列构建名为 paella 的 C 编译器的全过程。
Zig增量编译的内部机制
一位Zig核心团队成员解释了Zig增量编译的内部原理与使用方法,该技术仅重新编译变更的代码并修补到二进制文件中,从而实现毫秒级重建。