zalloc: 在你的 C 代码中使用 Zig 分配器

Lobsters Hottest 工具

摘要

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)

Hacker News Top

说明 Zig 的 comptime 和类型反射如何支持创建像 MultiArrayList 这样的数组结构体 (SoA) 数据结构,从而提升高性能应用中的缓存性能。

std.Io.Writer.Allocating 消耗了我所有内存

Lobsters Hottest

一篇博客文章揭示了 Zig 的 std.Io.Writer.Allocating 中存在的内存过度分配错误,原因是 `drain` 函数在每个数据切片上错误地预留了 splat 参数的空间,导致内存意外增长。

Zig ELF 链接器改进开发日志

Hacker News Top

新的 Zig ELF 链接器现在支持外部库和 C 源码的快速增量编译,在 x86_64 Linux 上能够实现毫秒级重建。

用 Zig 写一个 C 编译器

Hacker News Top

一位开发者记录了用 Zig 语言、按照 Nora Sandler 的教程系列构建名为 paella 的 C 编译器的全过程。

Zig增量编译的内部机制

Lobsters Hottest

一位Zig核心团队成员解释了Zig增量编译的内部原理与使用方法,该技术仅重新编译变更的代码并修补到二进制文件中,从而实现毫秒级重建。