2 ms·
But Zig lets you use arbritary number of bits... you can write `i4` for example, or `u120` or whatever, which is a pretty great advantage.
by brabel 3y ago
But Zig lets you use arbritary number of bits... you can write `i4` for example, or `u120` or whatever, which is a pretty great advantage.
- WalterBright 3y agoTrue, but can you create a pointer to a 4 bit type? I tried to make that work in D at one point, and wound up abandoning it. D allows 4 bit types using conventional bit fields (but you can't take a pointer to them).
- cancername 3y agoYes: const std = @import("std"); const expectEqual = std.testing.expectEqual; test "u4 is 1 byte" { try expectEqual(1, @sizeOf(u4)); } test "u4 is 4 bits" { try expectEqual(4, @bitSizeOf(u4)); } test "u4 is 1-byte-aligned" { try expectEqual(1, @alignOf(u4)); } test "pointers to u4 work like any other pointer type" { var foo: u4 = 10; const foo_p = &foo; try expectEqual(@as(u4, 10), foo_p.*); foo_p.* = 7; try expectEqual(@as(u4, 7), foo); } Packed structs are Zig's replacement for bit fields: const std = @import("std"); const expectEqual = std.testing.expectEqual; test "bool has a bit size of 1 bit, a size of 1 byte, and an alignment of 1 byte" { try expectEqual(1, @bitSizeOf(bool)); try expectEqual(1, @sizeOf(bool)); try expectEqual(1, @alignOf(bool)); } test "in a regular struct, fields are aligned to their natural alignment..." { const Natural = struct { read: bool, write: bool, exec: bool, }; try expectEqual(3, @sizeOf(Natural)); try expectEqual(1, @alignOf(Natural)); } test "...unless otherwise specified" { const TwoByteAligned = struct { read: bool align(2), write: bool align(2), exec: bool align(2), }; try expectEqual(6, @sizeOf(TwoByteAligned)); try expectEqual(2, @alignOf(TwoByteAligned)); } test "in a packed struct, fields occupy exactly their bit size" { const Packed = packed struct { read: bool, write: bool, exec: bool, }; try expectEqual(3, @bitSizeOf(Packed)); try expectEqual(1, @sizeOf(Packed)); try expectEqual(1, @alignOf(Packed)); }