Remix.run Logo
scritty-dev 4 hours ago

could you clarify for me, because isn't that a different guarantee? from my understanding, Rust and Zig make allocations explicit, but [@zero_alloc] lets you declare "this function (and everything it calls) must not allocate" and have compiler enforce it.

eatonphil 2 hours ago | parent | next [-]

They are indeed different. In Zig you might get the allocator via a struct field or just via importing the global allocator.

  const std = @import("std");

  fn makeBuffer(n: usize) ![]u8 {
      return std.heap.page_allocator.alloc(u8, n);
  }
Here are a few examples from the last release of Bun before the rewrite into Rust.

https://github.com/oven-sh/bun/blob/bun-v1.3.14/src/install/...

https://github.com/oven-sh/bun/blob/bun-v1.3.14/src/shell_pa...

The allocator via function parameter is only a convention and only even one convention. It is certainly a strong convention (throughout the standard library anyway) but it is just a convention.

Recent Rust also has the ability to pass allocators but that's the same thing. And even if you use no_std in Rust you might call into some other library's no_std function that allocates and you wouldn't be able to grep for that.

wmedrano 2 hours ago | parent | prev [-]

If you don't pass an allocator param in Zig, then the function basically can't allocate.