提交 545ef9d8 编写于 作者: T Tim Diekmann

Add `Layout::dangling()` to return a well-aligned `NonNull<u8>`

上级 2890b37b
...@@ -140,6 +140,18 @@ pub fn for_value<T: ?Sized>(t: &T) -> Self { ...@@ -140,6 +140,18 @@ pub fn for_value<T: ?Sized>(t: &T) -> Self {
unsafe { Layout::from_size_align_unchecked(size, align) } unsafe { Layout::from_size_align_unchecked(size, align) }
} }
/// Creates a `NonNull` that is dangling, but well-aligned for this Layout.
///
/// Note that the pointer value may potentially represent a valid pointer to
/// a `T`, which means this must not be used as a "not yet initialized"
/// sentinel value. Types that lazily allocate must track initialization by
/// some other means.
#[unstable(feature = "alloc_layout_extra", issue = "55724")]
pub const fn dangling(&self) -> NonNull<u8> {
// align is non-zero and a power of two
unsafe { NonNull::new_unchecked(self.align() as *mut u8) }
}
/// Creates a layout describing the record that can hold a value /// Creates a layout describing the record that can hold a value
/// of the same layout as `self`, but that also is aligned to /// of the same layout as `self`, but that also is aligned to
/// alignment `align` (measured in bytes). /// alignment `align` (measured in bytes).
......
use core::alloc::Layout; use core::alloc::Layout;
use core::ptr::NonNull;
#[test] #[test]
fn const_unchecked_layout() { fn const_unchecked_layout() {
const SIZE: usize = 0x2000; const SIZE: usize = 0x2000;
const ALIGN: usize = 0x1000; const ALIGN: usize = 0x1000;
const LAYOUT: Layout = unsafe { Layout::from_size_align_unchecked(SIZE, ALIGN) }; const LAYOUT: Layout = unsafe { Layout::from_size_align_unchecked(SIZE, ALIGN) };
const DANGLING: NonNull<u8> = LAYOUT.dangling();
assert_eq!(LAYOUT.size(), SIZE); assert_eq!(LAYOUT.size(), SIZE);
assert_eq!(LAYOUT.align(), ALIGN); assert_eq!(LAYOUT.align(), ALIGN);
assert_eq!(Some(DANGLING), NonNull::new(ALIGN as *mut u8));
} }
#![feature(alloc_layout_extra)]
#![feature(bool_to_option)] #![feature(bool_to_option)]
#![feature(bound_cloned)] #![feature(bound_cloned)]
#![feature(box_syntax)] #![feature(box_syntax)]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册