Comment by unclad5968

16 hours ago

What new ideas did Zig bring to memory management?

Pluggable allocators. Allocators are passed to functions as arguments, the caller decides exactly how memory is managed. Maybe not "new" in idea, but "new" in being consistently applied everywhere in language & libraries.

  • Already Turbo Pascal for MS-DOS had a custom allocator API for its runtime.

    All modern C++ collection types have allocators as type parameters, and this was already a thing in the compiler frameworks like OWL during the 90's.

    • Zig makes allocation an explicit runtime concern:

         var list = std.ArrayList(i32).init(allocator);
      

      where allocator is a runtime value implementing the allocator interface.

         fn parseJson(allocator: Allocator, input: []const u8) !JsonValue
      

      Zig forces the caller to decide since allocator is part of the function contract. And this is consistent everywhere in Zig. Effectively speaking, this is universal, explicit & mandated dependency injection for memory management as opposed to to classic C++ STL allocators.

      Sorry sir, I have a nostalgic fondness for C++ - it was my first language, but it just doesn't compare for flexible allocation convenience compared to Zig.

      1 reply →