mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
add definition of 'allocated object', and link it from relevant method docs
This commit is contained in:
parent
f811f14006
commit
b5d71bfb0f
@ -184,8 +184,7 @@ impl<T: ?Sized> *const T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and resulting pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * The computed offset, **in bytes**, cannot overflow an `isize`.
|
||||
///
|
||||
@ -210,6 +209,7 @@ impl<T: ?Sized> *const T {
|
||||
/// enables more aggressive compiler optimizations.
|
||||
///
|
||||
/// [`wrapping_offset`]: #method.wrapping_offset
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -245,9 +245,8 @@ impl<T: ?Sized> *const T {
|
||||
///
|
||||
/// This operation itself is always safe, but using the resulting pointer is not.
|
||||
///
|
||||
/// The resulting pointer remains attached to the same allocated object that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object. Note that in Rust, every
|
||||
/// (stack-allocated) variable is considered a separate allocated object.
|
||||
/// The resulting pointer remains attached to the same [allocated object] that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object.
|
||||
///
|
||||
/// In other words, `let z = x.wrapping_offset((y as isize) - (x as isize))` does *not* make `z`
|
||||
/// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
|
||||
@ -269,6 +268,7 @@ impl<T: ?Sized> *const T {
|
||||
/// do the arithmetic there.
|
||||
///
|
||||
/// [`offset`]: #method.offset
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -314,8 +314,7 @@ impl<T: ?Sized> *const T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and other pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * Both pointers must be *derived from* a pointer to the same object.
|
||||
/// (See below for an example.)
|
||||
@ -345,6 +344,7 @@ impl<T: ?Sized> *const T {
|
||||
/// such large allocations either.)
|
||||
///
|
||||
/// [`add`]: #method.add
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
@ -468,8 +468,7 @@ impl<T: ?Sized> *const T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and resulting pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * The computed offset, **in bytes**, cannot overflow an `isize`.
|
||||
///
|
||||
@ -494,6 +493,7 @@ impl<T: ?Sized> *const T {
|
||||
/// enables more aggressive compiler optimizations.
|
||||
///
|
||||
/// [`wrapping_add`]: #method.wrapping_add
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -532,8 +532,7 @@ impl<T: ?Sized> *const T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and resulting pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * The computed offset cannot exceed `isize::MAX` **bytes**.
|
||||
///
|
||||
@ -558,6 +557,7 @@ impl<T: ?Sized> *const T {
|
||||
/// enables more aggressive compiler optimizations.
|
||||
///
|
||||
/// [`wrapping_sub`]: #method.wrapping_sub
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -594,9 +594,8 @@ impl<T: ?Sized> *const T {
|
||||
///
|
||||
/// This operation itself is always safe, but using the resulting pointer is not.
|
||||
///
|
||||
/// The resulting pointer remains attached to the same allocated object that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object. Note that in Rust, every
|
||||
/// (stack-allocated) variable is considered a separate allocated object.
|
||||
/// The resulting pointer remains attached to the same [allocated object] that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object.
|
||||
///
|
||||
/// In other words, `let z = x.wrapping_add((y as usize) - (x as usize))` does *not* make `z`
|
||||
/// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
|
||||
@ -618,6 +617,7 @@ impl<T: ?Sized> *const T {
|
||||
/// do the arithmetic there.
|
||||
///
|
||||
/// [`add`]: #method.add
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -659,9 +659,8 @@ impl<T: ?Sized> *const T {
|
||||
///
|
||||
/// This operation itself is always safe, but using the resulting pointer is not.
|
||||
///
|
||||
/// The resulting pointer remains attached to the same allocated object that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object. Note that in Rust, every
|
||||
/// (stack-allocated) variable is considered a separate allocated object.
|
||||
/// The resulting pointer remains attached to the same [allocated object] that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object.
|
||||
///
|
||||
/// In other words, `let z = x.wrapping_sub((x as usize) - (y as usize))` does *not* make `z`
|
||||
/// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
|
||||
@ -683,6 +682,7 @@ impl<T: ?Sized> *const T {
|
||||
/// do the arithmetic there.
|
||||
///
|
||||
/// [`sub`]: #method.sub
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -997,7 +997,7 @@ impl<T> *const [T] {
|
||||
/// * The pointer must be [valid] for reads for `ptr.len() * mem::size_of::<T>()` many bytes,
|
||||
/// and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// * The entire memory range of this slice must be contained within a single [allocated object]!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
@ -1019,6 +1019,7 @@ impl<T> *const [T] {
|
||||
/// See also [`slice::from_raw_parts`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
|
||||
|
@ -55,6 +55,14 @@
|
||||
//! has size 0, i.e., even if memory is not actually touched. Consider using
|
||||
//! [`NonNull::dangling`] in such cases.
|
||||
//!
|
||||
//! ## Allocated object
|
||||
//!
|
||||
//! For several operations, such as [`offset`] or field projections (`expr.field`), the notion of an
|
||||
//! "allocated object" becomes relevant. An allocated object is a contiguous region of memory.
|
||||
//! Common examples of allocated objects include stack-allocated variables (each variable is a
|
||||
//! separate allocated object), heap allocations (each allocation created by the global allocator is
|
||||
//! a separate allocated object), and `static` variables.
|
||||
//!
|
||||
//! [aliasing]: ../../nomicon/aliasing.html
|
||||
//! [book]: ../../book/ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer
|
||||
//! [ub]: ../../reference/behavior-considered-undefined.html
|
||||
|
@ -189,8 +189,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and resulting pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * The computed offset, **in bytes**, cannot overflow an `isize`.
|
||||
///
|
||||
@ -215,6 +214,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// enables more aggressive compiler optimizations.
|
||||
///
|
||||
/// [`wrapping_offset`]: #method.wrapping_offset
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -251,9 +251,8 @@ impl<T: ?Sized> *mut T {
|
||||
///
|
||||
/// This operation itself is always safe, but using the resulting pointer is not.
|
||||
///
|
||||
/// The resulting pointer remains attached to the same allocated object that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object. Note that in Rust, every
|
||||
/// (stack-allocated) variable is considered a separate allocated object.
|
||||
/// The resulting pointer remains attached to the same [allocated object] that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object.
|
||||
///
|
||||
/// In other words, `let z = x.wrapping_offset((y as isize) - (x as isize))` does *not* make `z`
|
||||
/// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
|
||||
@ -275,6 +274,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// do the arithmetic there.
|
||||
///
|
||||
/// [`offset`]: #method.offset
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -485,8 +485,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and other pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * Both pointers must be *derived from* a pointer to the same object.
|
||||
/// (See below for an example.)
|
||||
@ -516,6 +515,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// such large allocations either.)
|
||||
///
|
||||
/// [`add`]: #method.add
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
@ -575,8 +575,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and resulting pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * The computed offset, **in bytes**, cannot overflow an `isize`.
|
||||
///
|
||||
@ -639,8 +638,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// Behavior:
|
||||
///
|
||||
/// * Both the starting and resulting pointer must be either in bounds or one
|
||||
/// byte past the end of the same allocated object. Note that in Rust,
|
||||
/// every (stack-allocated) variable is considered a separate allocated object.
|
||||
/// byte past the end of the same [allocated object].
|
||||
///
|
||||
/// * The computed offset cannot exceed `isize::MAX` **bytes**.
|
||||
///
|
||||
@ -665,6 +663,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// enables more aggressive compiler optimizations.
|
||||
///
|
||||
/// [`wrapping_sub`]: #method.wrapping_sub
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -701,9 +700,8 @@ impl<T: ?Sized> *mut T {
|
||||
///
|
||||
/// This operation itself is always safe, but using the resulting pointer is not.
|
||||
///
|
||||
/// The resulting pointer remains attached to the same allocated object that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object. Note that in Rust, every
|
||||
/// (stack-allocated) variable is considered a separate allocated object.
|
||||
/// The resulting pointer remains attached to the same [allocated object] that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object.
|
||||
///
|
||||
/// In other words, `let z = x.wrapping_add((y as usize) - (x as usize))` does *not* make `z`
|
||||
/// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
|
||||
@ -725,6 +723,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// do the arithmetic there.
|
||||
///
|
||||
/// [`add`]: #method.add
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -766,9 +765,8 @@ impl<T: ?Sized> *mut T {
|
||||
///
|
||||
/// This operation itself is always safe, but using the resulting pointer is not.
|
||||
///
|
||||
/// The resulting pointer remains attached to the same allocated object that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object. Note that in Rust, every
|
||||
/// (stack-allocated) variable is considered a separate allocated object.
|
||||
/// The resulting pointer remains attached to the same [allocated object] that `self` points to.
|
||||
/// It may *not* be used to access a different allocated object.
|
||||
///
|
||||
/// In other words, `let z = x.wrapping_sub((x as usize) - (y as usize))` does *not* make `z`
|
||||
/// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
|
||||
@ -790,6 +788,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// do the arithmetic there.
|
||||
///
|
||||
/// [`sub`]: #method.sub
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -1261,7 +1260,7 @@ impl<T> *mut [T] {
|
||||
/// * The pointer must be [valid] for reads for `ptr.len() * mem::size_of::<T>()` many bytes,
|
||||
/// and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// * The entire memory range of this slice must be contained within a single [allocated object]!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
@ -1283,6 +1282,7 @@ impl<T> *mut [T] {
|
||||
/// See also [`slice::from_raw_parts`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
|
||||
@ -1311,7 +1311,7 @@ impl<T> *mut [T] {
|
||||
/// * The pointer must be [valid] for reads and writes for `ptr.len() * mem::size_of::<T>()`
|
||||
/// many bytes, and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// * The entire memory range of this slice must be contained within a single [allocated object]!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
@ -1333,6 +1333,7 @@ impl<T> *mut [T] {
|
||||
/// See also [`slice::from_raw_parts_mut`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice_mut<'a>(self) -> Option<&'a mut [MaybeUninit<T>]> {
|
||||
|
Loading…
Reference in New Issue
Block a user