mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Add size_of
, size_of_val
, align_of
, and align_of_val
to the prelude
Many, many projects use `size_of` to get the size of a type. However, it's also often equally easy to hardcode a size (e.g. `8` instead of `size_of::<u64>()`). Minimizing friction in the use of `size_of` helps ensure that people use it and make code more self-documenting. The name `size_of` is unambiguous: the name alone, without any prefix or path, is self-explanatory and unmistakeable for any other functionality. Adding it to the prelude cannot produce any name conflicts, as any local definition will silently shadow the one from the prelude. Thus, we don't need to wait for a new edition prelude to add it. Add `size_of_val`, `align_of`, and `align_of_val` as well, with similar justification: widely useful, self-explanatory, unmistakeable for anything else, won't produce conflicts.
This commit is contained in:
parent
6be7b0c7d2
commit
a5a60d75a8
@ -4,7 +4,7 @@ use crate::traits;
|
|||||||
use crate::ty::adjustment::CoerceUnsizedInfo;
|
use crate::ty::adjustment::CoerceUnsizedInfo;
|
||||||
use crate::ty::{self, Ty};
|
use crate::ty::{self, Ty};
|
||||||
use std::intrinsics::transmute_unchecked;
|
use std::intrinsics::transmute_unchecked;
|
||||||
use std::mem::{size_of, MaybeUninit};
|
use std::mem::MaybeUninit;
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct Erased<T: Copy> {
|
pub struct Erased<T: Copy> {
|
||||||
|
@ -257,8 +257,6 @@ use core::intrinsics::abort;
|
|||||||
#[cfg(not(no_global_oom_handling))]
|
#[cfg(not(no_global_oom_handling))]
|
||||||
use core::iter;
|
use core::iter;
|
||||||
use core::marker::{PhantomData, Unsize};
|
use core::marker::{PhantomData, Unsize};
|
||||||
#[cfg(not(no_global_oom_handling))]
|
|
||||||
use core::mem::size_of_val;
|
|
||||||
use core::mem::{self, align_of_val_raw, forget, ManuallyDrop};
|
use core::mem::{self, align_of_val_raw, forget, ManuallyDrop};
|
||||||
use core::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn, Receiver};
|
use core::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn, Receiver};
|
||||||
use core::panic::{RefUnwindSafe, UnwindSafe};
|
use core::panic::{RefUnwindSafe, UnwindSafe};
|
||||||
|
@ -18,8 +18,6 @@ use core::intrinsics::abort;
|
|||||||
#[cfg(not(no_global_oom_handling))]
|
#[cfg(not(no_global_oom_handling))]
|
||||||
use core::iter;
|
use core::iter;
|
||||||
use core::marker::{PhantomData, Unsize};
|
use core::marker::{PhantomData, Unsize};
|
||||||
#[cfg(not(no_global_oom_handling))]
|
|
||||||
use core::mem::size_of_val;
|
|
||||||
use core::mem::{self, align_of_val_raw};
|
use core::mem::{self, align_of_val_raw};
|
||||||
use core::ops::{CoerceUnsized, Deref, DerefPure, DispatchFromDyn, Receiver};
|
use core::ops::{CoerceUnsized, Deref, DerefPure, DispatchFromDyn, Receiver};
|
||||||
use core::panic::{RefUnwindSafe, UnwindSafe};
|
use core::panic::{RefUnwindSafe, UnwindSafe};
|
||||||
|
@ -238,7 +238,7 @@
|
|||||||
use crate::cmp::Ordering;
|
use crate::cmp::Ordering;
|
||||||
use crate::fmt::{self, Debug, Display};
|
use crate::fmt::{self, Debug, Display};
|
||||||
use crate::marker::{PhantomData, Unsize};
|
use crate::marker::{PhantomData, Unsize};
|
||||||
use crate::mem::{self, size_of};
|
use crate::mem;
|
||||||
use crate::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn};
|
use crate::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn};
|
||||||
use crate::ptr::{self, NonNull};
|
use crate::ptr::{self, NonNull};
|
||||||
|
|
||||||
|
@ -65,7 +65,6 @@
|
|||||||
|
|
||||||
use crate::marker::DiscriminantKind;
|
use crate::marker::DiscriminantKind;
|
||||||
use crate::marker::Tuple;
|
use crate::marker::Tuple;
|
||||||
use crate::mem::align_of;
|
|
||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
use crate::ub_checks;
|
use crate::ub_checks;
|
||||||
|
|
||||||
|
@ -14,6 +14,9 @@ pub use crate::ops::{Drop, Fn, FnMut, FnOnce};
|
|||||||
#[stable(feature = "core_prelude", since = "1.4.0")]
|
#[stable(feature = "core_prelude", since = "1.4.0")]
|
||||||
#[doc(no_inline)]
|
#[doc(no_inline)]
|
||||||
pub use crate::mem::drop;
|
pub use crate::mem::drop;
|
||||||
|
#[stable(feature = "size_of_prelude", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
#[doc(no_inline)]
|
||||||
|
pub use crate::mem::{align_of, align_of_val, size_of, size_of_val};
|
||||||
|
|
||||||
// Re-exported types and traits
|
// Re-exported types and traits
|
||||||
#[stable(feature = "core_prelude", since = "1.4.0")]
|
#[stable(feature = "core_prelude", since = "1.4.0")]
|
||||||
|
@ -392,7 +392,7 @@ use crate::intrinsics;
|
|||||||
use crate::marker::FnPtr;
|
use crate::marker::FnPtr;
|
||||||
use crate::ub_checks;
|
use crate::ub_checks;
|
||||||
|
|
||||||
use crate::mem::{self, align_of, size_of, MaybeUninit};
|
use crate::mem::{self, MaybeUninit};
|
||||||
|
|
||||||
mod alignment;
|
mod alignment;
|
||||||
#[unstable(feature = "ptr_alignment_type", issue = "102070")]
|
#[unstable(feature = "ptr_alignment_type", issue = "102070")]
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
//! Free functions to create `&[T]` and `&mut [T]`.
|
//! Free functions to create `&[T]` and `&mut [T]`.
|
||||||
|
|
||||||
use crate::array;
|
use crate::array;
|
||||||
use crate::mem::{align_of, size_of};
|
|
||||||
use crate::ops::Range;
|
use crate::ops::Range;
|
||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
use crate::ub_checks;
|
use crate::ub_checks;
|
||||||
|
@ -1296,7 +1296,6 @@ impl<T> AtomicPtr<T> {
|
|||||||
#[cfg(target_has_atomic_equal_alignment = "ptr")]
|
#[cfg(target_has_atomic_equal_alignment = "ptr")]
|
||||||
#[unstable(feature = "atomic_from_mut", issue = "76314")]
|
#[unstable(feature = "atomic_from_mut", issue = "76314")]
|
||||||
pub fn from_mut(v: &mut *mut T) -> &mut Self {
|
pub fn from_mut(v: &mut *mut T) -> &mut Self {
|
||||||
use crate::mem::align_of;
|
|
||||||
let [] = [(); align_of::<AtomicPtr<()>>() - align_of::<*mut ()>()];
|
let [] = [(); align_of::<AtomicPtr<()>>() - align_of::<*mut ()>()];
|
||||||
// SAFETY:
|
// SAFETY:
|
||||||
// - the mutable reference guarantees unique ownership.
|
// - the mutable reference guarantees unique ownership.
|
||||||
@ -2286,7 +2285,6 @@ macro_rules! atomic_int {
|
|||||||
#[$cfg_align]
|
#[$cfg_align]
|
||||||
#[unstable(feature = "atomic_from_mut", issue = "76314")]
|
#[unstable(feature = "atomic_from_mut", issue = "76314")]
|
||||||
pub fn from_mut(v: &mut $int_type) -> &mut Self {
|
pub fn from_mut(v: &mut $int_type) -> &mut Self {
|
||||||
use crate::mem::align_of;
|
|
||||||
let [] = [(); align_of::<Self>() - align_of::<$int_type>()];
|
let [] = [(); align_of::<Self>() - align_of::<$int_type>()];
|
||||||
// SAFETY:
|
// SAFETY:
|
||||||
// - the mutable reference guarantees unique ownership.
|
// - the mutable reference guarantees unique ownership.
|
||||||
@ -2354,7 +2352,6 @@ macro_rules! atomic_int {
|
|||||||
#[$cfg_align]
|
#[$cfg_align]
|
||||||
#[unstable(feature = "atomic_from_mut", issue = "76314")]
|
#[unstable(feature = "atomic_from_mut", issue = "76314")]
|
||||||
pub fn from_mut_slice(v: &mut [$int_type]) -> &mut [Self] {
|
pub fn from_mut_slice(v: &mut [$int_type]) -> &mut [Self] {
|
||||||
use crate::mem::align_of;
|
|
||||||
let [] = [(); align_of::<Self>() - align_of::<$int_type>()];
|
let [] = [(); align_of::<Self>() - align_of::<$int_type>()];
|
||||||
// SAFETY:
|
// SAFETY:
|
||||||
// - the mutable reference guarantees unique ownership.
|
// - the mutable reference guarantees unique ownership.
|
||||||
|
@ -96,7 +96,7 @@ where
|
|||||||
fn cast<U>(self) -> Self::CastPtr<U> {
|
fn cast<U>(self) -> Self::CastPtr<U> {
|
||||||
// SimdElement currently requires zero-sized metadata, so this should never fail.
|
// SimdElement currently requires zero-sized metadata, so this should never fail.
|
||||||
// If this ever changes, `simd_cast_ptr` should produce a post-mono error.
|
// If this ever changes, `simd_cast_ptr` should produce a post-mono error.
|
||||||
use core::{mem::size_of, ptr::Pointee};
|
use core::ptr::Pointee;
|
||||||
assert_eq!(size_of::<<T as Pointee>::Metadata>(), 0);
|
assert_eq!(size_of::<<T as Pointee>::Metadata>(), 0);
|
||||||
assert_eq!(size_of::<<U as Pointee>::Metadata>(), 0);
|
assert_eq!(size_of::<<U as Pointee>::Metadata>(), 0);
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ where
|
|||||||
fn cast<U>(self) -> Self::CastPtr<U> {
|
fn cast<U>(self) -> Self::CastPtr<U> {
|
||||||
// SimdElement currently requires zero-sized metadata, so this should never fail.
|
// SimdElement currently requires zero-sized metadata, so this should never fail.
|
||||||
// If this ever changes, `simd_cast_ptr` should produce a post-mono error.
|
// If this ever changes, `simd_cast_ptr` should produce a post-mono error.
|
||||||
use core::{mem::size_of, ptr::Pointee};
|
use core::ptr::Pointee;
|
||||||
assert_eq!(size_of::<<T as Pointee>::Metadata>(), 0);
|
assert_eq!(size_of::<<T as Pointee>::Metadata>(), 0);
|
||||||
assert_eq!(size_of::<<U as Pointee>::Metadata>(), 0);
|
assert_eq!(size_of::<<U as Pointee>::Metadata>(), 0);
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::hash::BuildHasherDefault;
|
use std::hash::BuildHasherDefault;
|
||||||
use std::hash::Hasher;
|
use std::hash::Hasher;
|
||||||
use std::mem::size_of;
|
|
||||||
use std::ops::BitXor;
|
use std::ops::BitXor;
|
||||||
|
|
||||||
/// Type alias for a hashmap using the `fx` hash algorithm.
|
/// Type alias for a hashmap using the `fx` hash algorithm.
|
||||||
|
@ -104,7 +104,6 @@
|
|||||||
|
|
||||||
use super::{Custom, ErrorData, ErrorKind, RawOsError, SimpleMessage};
|
use super::{Custom, ErrorData, ErrorKind, RawOsError, SimpleMessage};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use core::mem::{align_of, size_of};
|
|
||||||
use core::ptr::{self, NonNull};
|
use core::ptr::{self, NonNull};
|
||||||
|
|
||||||
// The 2 least-significant bits are used as tag.
|
// The 2 least-significant bits are used as tag.
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
use super::{sockaddr_un, SocketAddr};
|
use super::{sockaddr_un, SocketAddr};
|
||||||
use crate::io::{self, IoSlice, IoSliceMut};
|
use crate::io::{self, IoSlice, IoSliceMut};
|
||||||
use crate::marker::PhantomData;
|
use crate::marker::PhantomData;
|
||||||
use crate::mem::{size_of, zeroed};
|
use crate::mem::zeroed;
|
||||||
use crate::os::unix::io::RawFd;
|
use crate::os::unix::io::RawFd;
|
||||||
use crate::path::Path;
|
use crate::path::Path;
|
||||||
use crate::ptr::{eq, read_unaligned};
|
use crate::ptr::{eq, read_unaligned};
|
||||||
|
@ -14,6 +14,9 @@ pub use crate::ops::{Drop, Fn, FnMut, FnOnce};
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[doc(no_inline)]
|
#[doc(no_inline)]
|
||||||
pub use crate::mem::drop;
|
pub use crate::mem::drop;
|
||||||
|
#[stable(feature = "size_of_prelude", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
#[doc(no_inline)]
|
||||||
|
pub use crate::mem::{align_of, align_of_val, size_of, size_of_val};
|
||||||
|
|
||||||
// Re-exported types and traits
|
// Re-exported types and traits
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
@ -36,6 +36,10 @@
|
|||||||
//! operations for both destructors and overloading `()`.
|
//! operations for both destructors and overloading `()`.
|
||||||
//! * <code>[std::mem]::[drop]</code>, a convenience function for explicitly
|
//! * <code>[std::mem]::[drop]</code>, a convenience function for explicitly
|
||||||
//! dropping a value.
|
//! dropping a value.
|
||||||
|
//! * <code>[std::mem]::{[size_of], [size_of_val]}</code>, to get the size of
|
||||||
|
//! a type or value.
|
||||||
|
//! * <code>[std::mem]::{[align_of], [align_of_val]}</code>, to get the
|
||||||
|
//! alignment of a type or value.
|
||||||
//! * <code>[std::boxed]::[Box]</code>, a way to allocate values on the heap.
|
//! * <code>[std::boxed]::[Box]</code>, a way to allocate values on the heap.
|
||||||
//! * <code>[std::borrow]::[ToOwned]</code>, the conversion trait that defines
|
//! * <code>[std::borrow]::[ToOwned]</code>, the conversion trait that defines
|
||||||
//! [`to_owned`], the generic method for creating an owned type from a
|
//! [`to_owned`], the generic method for creating an owned type from a
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
// Should suggest only `std::mem::size_of`
|
// Should suggest only `std::mem::transmute`
|
||||||
let _ = size_of::<usize>();
|
let _ = transmute::<usize>();
|
||||||
//~^ ERROR cannot find
|
//~^ ERROR cannot find
|
||||||
|
|
||||||
// Should suggest `std::intrinsics::fabsf64`,
|
// Should suggest `std::intrinsics::fabsf64`,
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
error[E0425]: cannot find function `size_of` in this scope
|
error[E0425]: cannot find function `transmute` in this scope
|
||||||
--> $DIR/filter-intrinsics.rs:3:13
|
--> $DIR/filter-intrinsics.rs:3:13
|
||||||
|
|
|
|
||||||
LL | let _ = size_of::<usize>();
|
LL | let _ = transmute::<usize>();
|
||||||
| ^^^^^^^ not found in this scope
|
| ^^^^^^^^^ not found in this scope
|
||||||
|
|
|
|
||||||
help: consider importing this function
|
help: consider importing this function
|
||||||
|
|
|
|
||||||
LL + use std::mem::size_of;
|
LL + use std::mem::transmute;
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0425]: cannot find function `fabsf64` in this scope
|
error[E0425]: cannot find function `fabsf64` in this scope
|
||||||
|
Loading…
Reference in New Issue
Block a user