3 ms·
One reason it’s harder to follow is you can’t have references to uninitialized memory. In Zig pointers to uninitialized memory are fine as long as you don’t der
by mk12 2y ago
One reason it’s harder to follow is you can’t have references to uninitialized memory. In Zig pointers to uninitialized memory are fine as long as you don’t dereference them. That’s also true of Rust’s raw pointers, but most Rust code uses references, so it can’t be reused in unsafe contexts.
As a concrete example, I previously used Vec in unsafe code that dealt with uninitialized memory. This should be fine because Vec is basically a raw pointer and two integers. But later they changed the docs to say that this was undefined behavior (essentially, Vec reserves the right to “produce” a reference whenever it wants, even if you avoid calling methods that would do that). So my code that previously followed the rules now appeared to violate them.
- oneshtein 2y ago> you can’t have references to uninitialized memory. The method is available[0] in nightly Rust pub const unsafe fn as_uninit_ref<'a>(self) -> Option<&'a MaybeUninit<T>> where T: Sized, { // SAFETY: the caller must guarantee that `self` meets all the // requirements for a reference. if self.is_null() { None } else { Some(unsafe { &*(self as *const MaybeUninit<T>) }) } } [0]: https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.as_uninit_ref-1 https://doc.rust-lang.org/stable/core/primitive.pointer.html...