Trait origin_studio::std::marker::Copy
1.0.0 · source · pub trait Copy: Clone { }Expand description
Types whose values can be duplicated simply by copying bits.
By default, variable bindings have ‘move semantics.’ In other words:
#[derive(Debug)]
struct Foo;
let x = Foo;
let y = x;
// `x` has moved into `y`, and so cannot be used
// println!("{x:?}"); // error: use of moved valueHowever, if a type implements Copy, it instead has ‘copy semantics’:
// We can derive a `Copy` implementation. `Clone` is also required, as it's
// a supertrait of `Copy`.
#[derive(Debug, Copy, Clone)]
struct Foo;
let x = Foo;
let y = x;
// `y` is a copy of `x`
println!("{x:?}"); // A-OK!It’s important to note that in these two examples, the only difference is whether you
are allowed to access x after the assignment. Under the hood, both a copy and a move
can result in bits being copied in memory, although this is sometimes optimized away.
How can I implement Copy?
There are two ways to implement Copy on your type. The simplest is to use derive:
#[derive(Copy, Clone)]
struct MyStruct;You can also implement Copy and Clone manually:
struct MyStruct;
impl Copy for MyStruct { }
impl Clone for MyStruct {
fn clone(&self) -> MyStruct {
*self
}
}There is a small difference between the two: the derive strategy will also place a Copy
bound on type parameters, which isn’t always desired.
What’s the difference between Copy and Clone?
Copies happen implicitly, for example as part of an assignment y = x. The behavior of
Copy is not overloadable; it is always a simple bit-wise copy.
Cloning is an explicit action, x.clone(). The implementation of Clone can
provide any type-specific behavior necessary to duplicate values safely. For example,
the implementation of Clone for String needs to copy the pointed-to string
buffer in the heap. A simple bitwise copy of String values would merely copy the
pointer, leading to a double free down the line. For this reason, String is Clone
but not Copy.
Clone is a supertrait of Copy, so everything which is Copy must also implement
Clone. If a type is Copy then its Clone implementation only needs to return *self
(see the example above).
When can my type be Copy?
A type can implement Copy if all of its components implement Copy. For example, this
struct can be Copy:
#[derive(Copy, Clone)]
struct Point {
x: i32,
y: i32,
}A struct can be Copy, and i32 is Copy, therefore Point is eligible to be Copy.
By contrast, consider
struct PointList {
points: Vec<Point>,
}The struct PointList cannot implement Copy, because Vec<T> is not Copy. If we
attempt to derive a Copy implementation, we’ll get an error:
the trait `Copy` cannot be implemented for this type; field `points` does not implement `Copy`
Shared references (&T) are also Copy, so a type can be Copy, even when it holds
shared references of types T that are not Copy. Consider the following struct,
which can implement Copy, because it only holds a shared reference to our non-Copy
type PointList from above:
#[derive(Copy, Clone)]
struct PointListWrapper<'a> {
point_list_ref: &'a PointList,
}When can’t my type be Copy?
Some types can’t be copied safely. For example, copying &mut T would create an aliased
mutable reference. Copying String would duplicate responsibility for managing the
String’s buffer, leading to a double free.
Generalizing the latter case, any type implementing Drop can’t be Copy, because it’s
managing some resource besides its own size_of::<T> bytes.
If you try to implement Copy on a struct or enum containing non-Copy data, you will get
the error E0204.
When should my type be Copy?
Generally speaking, if your type can implement Copy, it should. Keep in mind, though,
that implementing Copy is part of the public API of your type. If the type might become
non-Copy in the future, it could be prudent to omit the Copy implementation now, to
avoid a breaking API change.
Additional implementors
In addition to the implementors listed below,
the following types also implement Copy:
- Function item types (i.e., the distinct types defined for each function)
- Function pointer types (e.g.,
fn() -> i32) - Closure types, if they capture no value from the environment
or if all such captured values implement
Copythemselves. Note that variables captured by shared reference always implementCopy(even if the referent doesn’t), while variables captured by mutable reference never implementCopy.
Implementors§
impl Copy for AsciiChar
impl Copy for origin_studio::std::cmp::Ordering
impl Copy for Infallible
impl Copy for VarError
impl Copy for origin_studio::std::fmt::Alignment
impl Copy for IpAddr
impl Copy for Ipv6MulticastScope
impl Copy for SocketAddr
impl Copy for FpCategory
impl Copy for Which
impl Copy for SearchStep
impl Copy for origin_studio::std::sync::atomic::Ordering
impl Copy for rustix::backend::fs::types::Advice
impl Copy for FileType
impl Copy for FlockOperation
impl Copy for rustix::backend::mm::types::Advice
impl Copy for MembarrierCommand
impl Copy for Resource
impl Copy for FutexOperation
impl Copy for TimerfdClockId
impl Copy for ClockId
impl Copy for SeekFrom
impl Copy for Direction
impl Copy for DumpableBehavior
impl Copy for EndianMode
impl Copy for FloatingPointMode
impl Copy for MachineCheckMemoryCorruptionKillPolicy
impl Copy for PTracer
impl Copy for SpeculationFeature
impl Copy for TimeStampCounterReadability
impl Copy for TimingMethod
impl Copy for VirtualMemoryMapAddress
impl Copy for Signal
impl Copy for Capability
impl Copy for CoreSchedulingScope
impl Copy for SecureComputingMode
impl Copy for SysCallUserDispatchFastSwitch
impl Copy for LinkNameSpaceType
impl Copy for bool
impl Copy for char
impl Copy for f32
impl Copy for f64
impl Copy for i8
impl Copy for i16
impl Copy for i32
impl Copy for i64
impl Copy for i128
impl Copy for isize
impl Copy for !
impl Copy for u8
impl Copy for u16
impl Copy for u32
impl Copy for u64
impl Copy for u128
impl Copy for usize
impl Copy for AllocError
impl Copy for Global
impl Copy for Layout
impl Copy for TypeId
impl Copy for CpuidResult
impl Copy for __m128
impl Copy for __m128bh
impl Copy for __m128d
impl Copy for __m128i
impl Copy for __m256
impl Copy for __m256bh
impl Copy for __m256d
impl Copy for __m256i
impl Copy for __m512
impl Copy for __m512bh
impl Copy for __m512d
impl Copy for __m512i
impl Copy for TryFromSliceError
impl Copy for CharTryFromError
impl Copy for TryFromCharError
impl Copy for origin_studio::std::fmt::Error
impl Copy for Assume
impl Copy for Ipv4Addr
impl Copy for Ipv6Addr
impl Copy for SocketAddrV4
impl Copy for SocketAddrV6
impl Copy for NonZeroI8
impl Copy for NonZeroI16
impl Copy for NonZeroI32
impl Copy for NonZeroI64
impl Copy for NonZeroI128
impl Copy for NonZeroIsize
impl Copy for NonZeroU8
impl Copy for NonZeroU16
impl Copy for NonZeroU32
impl Copy for NonZeroU64
impl Copy for NonZeroU128
impl Copy for NonZeroUsize
impl Copy for TryFromIntError
impl Copy for RangeFull
impl Copy for origin_studio::std::ptr::Alignment
impl Copy for Utf8Error
impl Copy for Duration
impl Copy for TimSortRun
impl Copy for RawWakerVTable
impl Copy for Thread
impl Copy for CreateFlags
impl Copy for WatchFlags
impl Copy for Access
impl Copy for AtFlags
impl Copy for FallocateFlags
impl Copy for MemfdFlags
impl Copy for Mode
impl Copy for OFlags
impl Copy for RenameFlags
impl Copy for ResolveFlags
impl Copy for SealFlags
impl Copy for Stat
impl Copy for StatVfsMountFlags
impl Copy for StatxFlags
impl Copy for Errno
impl Copy for DupFlags
impl Copy for FdFlags
impl Copy for ReadWriteFlags
impl Copy for MapFlags
impl Copy for MlockFlags
impl Copy for MprotectFlags
impl Copy for MremapFlags
impl Copy for MsyncFlags
impl Copy for ProtFlags
impl Copy for UserfaultfdFlags
impl Copy for MountFlags
impl Copy for MountPropagationFlags
impl Copy for UnmountFlags
impl Copy for PipeFlags
impl Copy for SpliceFlags
impl Copy for FutexFlags
impl Copy for TimerfdFlags
impl Copy for TimerfdTimerFlags
impl Copy for XattrFlags
impl Copy for Opcode
impl Copy for Pid
impl Copy for Cpuid
impl Copy for MembarrierQuery
impl Copy for PidfdFlags
impl Copy for PidfdGetfdFlags
impl Copy for FloatingPointEmulationControl
impl Copy for FloatingPointExceptionMode
impl Copy for SpeculationFeatureControl
impl Copy for SpeculationFeatureState
impl Copy for UnalignedAccessControl
impl Copy for CpuSet
impl Copy for WaitOptions
impl Copy for WaitStatus
impl Copy for WaitidOptions
impl Copy for WaitidStatus
impl Copy for CapabilityFlags
impl Copy for CapabilitySets
impl Copy for CapabilitiesSecureBits
impl Copy for SVEVectorLengthConfig
impl Copy for TaggedAddressMode
impl Copy for ThreadNameSpaceType
impl Copy for Gid
impl Copy for Uid
impl Copy for PhantomPinned
impl Copy for AArch64
impl Copy for Arm
impl Copy for Augmentation
impl Copy for BigEndian
impl Copy for DebugTypeSignature
impl Copy for DwAccess
impl Copy for DwAddr
impl Copy for DwAt
impl Copy for DwAte
impl Copy for DwCc
impl Copy for DwCfa
impl Copy for DwChildren
impl Copy for DwDefaulted
impl Copy for DwDs
impl Copy for DwDsc
impl Copy for DwEhPe
impl Copy for DwEnd
impl Copy for DwForm
impl Copy for DwId
impl Copy for DwIdx
impl Copy for DwInl
impl Copy for DwLang
impl Copy for DwLle
impl Copy for DwLnct
impl Copy for DwLne
impl Copy for DwLns
impl Copy for DwMacro
impl Copy for DwOp
impl Copy for DwOrd
impl Copy for DwRle
impl Copy for DwSect
impl Copy for DwSectV2
impl Copy for DwTag
impl Copy for DwUt
impl Copy for DwVirtuality
impl Copy for DwVis
impl Copy for DwarfFileType
impl Copy for DwoId
impl Copy for Encoding
impl Copy for Error
impl Copy for Format
impl Copy for LineEncoding
impl Copy for LittleEndian
impl Copy for Pointer
impl Copy for Range
impl Copy for ReaderOffsetId
impl Copy for Register
impl Copy for RiscV
impl Copy for RunTimeEndian
impl Copy for SectionId
impl Copy for StoreOnHeap
impl Copy for UnitIndexSection
impl Copy for UnwindAction
impl Copy for UnwindReasonCode
impl Copy for Value
impl Copy for ValueType
impl Copy for X86
impl Copy for X86_64
impl Copy for __kernel_fd_set
impl Copy for __kernel_fsid_t
impl Copy for __kernel_itimerspec
impl Copy for __kernel_old_itimerval
impl Copy for __kernel_old_timespec
impl Copy for __kernel_old_timeval
impl Copy for __kernel_sock_timeval
impl Copy for __kernel_timespec
impl Copy for __old_kernel_stat
impl Copy for __sifields
impl Copy for __sifields__bindgen_ty_1
impl Copy for __sifields__bindgen_ty_2
impl Copy for __sifields__bindgen_ty_3
impl Copy for __sifields__bindgen_ty_4
impl Copy for __sifields__bindgen_ty_5
impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1
impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1
impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2
impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3
impl Copy for __sifields__bindgen_ty_6
impl Copy for __sifields__bindgen_ty_7
impl Copy for __user_cap_data_struct
impl Copy for __user_cap_header_struct
impl Copy for clone_args
impl Copy for compat_statfs64
impl Copy for epoll_event
impl Copy for f_owner_ex
impl Copy for file_clone_range
impl Copy for file_dedupe_range_info
impl Copy for files_stat_struct
impl Copy for flock
impl Copy for flock64
impl Copy for fsconfig_command
impl Copy for fscrypt_get_key_status_arg
impl Copy for fscrypt_get_policy_ex_arg
impl Copy for fscrypt_get_policy_ex_arg__bindgen_ty_1
impl Copy for fscrypt_key
impl Copy for fscrypt_key_specifier
impl Copy for fscrypt_key_specifier__bindgen_ty_1
impl Copy for fscrypt_policy_v1
impl Copy for fscrypt_policy_v2
impl Copy for fscrypt_remove_key_arg
impl Copy for fstrim_range
impl Copy for fsxattr
impl Copy for futex_waitv
impl Copy for inodes_stat_t
impl Copy for iovec
impl Copy for itimerspec
impl Copy for itimerval
impl Copy for kernel_sigaction
impl Copy for kernel_sigset_t
impl Copy for ktermios
impl Copy for membarrier_cmd
impl Copy for membarrier_cmd_flag
impl Copy for mount_attr
impl Copy for open_how
impl Copy for pollfd
impl Copy for prctl_mm_map
impl Copy for rlimit
impl Copy for rlimit64
impl Copy for robust_list
impl Copy for robust_list_head
impl Copy for rusage
impl Copy for sigaction
impl Copy for sigaction__bindgen_ty_1
impl Copy for sigaltstack
impl Copy for sigevent
impl Copy for sigevent__bindgen_ty_1
impl Copy for sigevent__bindgen_ty_1__bindgen_ty_1
impl Copy for siginfo
impl Copy for siginfo__bindgen_ty_1
impl Copy for siginfo__bindgen_ty_1__bindgen_ty_1
impl Copy for sigval
impl Copy for stat
impl Copy for stat64
impl Copy for statfs
impl Copy for statfs64
impl Copy for statx
impl Copy for statx_timestamp
impl Copy for termio
impl Copy for termios
impl Copy for termios2
impl Copy for timespec
impl Copy for timeval
impl Copy for timezone
impl Copy for uffd_msg
impl Copy for uffd_msg__bindgen_ty_1
impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_1
impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1
impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_2
impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_3
impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_4
impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_5
impl Copy for uffdio_api
impl Copy for uffdio_continue
impl Copy for uffdio_copy
impl Copy for uffdio_range
impl Copy for uffdio_register
impl Copy for uffdio_writeprotect
impl Copy for uffdio_zeropage
impl Copy for user_desc
impl Copy for vfs_cap_data
impl Copy for vfs_cap_data__bindgen_ty_1
impl Copy for vfs_ns_cap_data
impl Copy for vfs_ns_cap_data__bindgen_ty_1
impl Copy for winsize
impl<'a> Copy for DynamicClockId<'a>
impl<'a> Copy for Arguments<'a>
impl<'a> Copy for origin_studio::std::panic::Location<'a>
impl<'a> Copy for IoSlice<'a>
impl<'a, T, const N: usize> Copy for ArrayWindows<'a, T, N>where T: Copy + 'a,
impl<'fd> Copy for BorrowedFd<'fd>
impl<'input, Endian> Copy for EndianSlice<'input, Endian>where Endian: Copy + Endianity,
impl<B, C> Copy for ControlFlow<B, C>where B: Copy, C: Copy,
impl<Dyn> Copy for DynMetadata<Dyn>where Dyn: ?Sized,
impl<F> Copy for RepeatWith<F>where F: Copy,
impl<Idx> Copy for RangeTo<Idx>where Idx: Copy,
impl<Idx> Copy for RangeToInclusive<Idx>where Idx: Copy,
impl<P> Copy for Pin<P>where P: Copy,
impl<R> Copy for DebugAddr<R>where R: Copy,
impl<R> Copy for DebugAranges<R>where R: Copy,
impl<R> Copy for DebugCuIndex<R>where R: Copy,
impl<R> Copy for DebugFrame<R>where R: Copy + Reader,
impl<R> Copy for DebugLineStr<R>where R: Copy,
impl<R> Copy for DebugLoc<R>where R: Copy,
impl<R> Copy for DebugLocLists<R>where R: Copy,
impl<R> Copy for DebugRanges<R>where R: Copy,
impl<R> Copy for DebugRngLists<R>where R: Copy,
impl<R> Copy for DebugStr<R>where R: Copy,
impl<R> Copy for DebugStrOffsets<R>where R: Copy,
impl<R> Copy for DebugTuIndex<R>where R: Copy,
impl<R> Copy for EhFrame<R>where R: Copy + Reader,
impl<R> Copy for EhFrameHdr<R>where R: Copy + Reader,
impl<R> Copy for Expression<R>where R: Copy + Reader,
impl<R> Copy for LocationListEntry<R>where R: Copy + Reader,
impl<R> Copy for LocationLists<R>where R: Copy,
impl<R> Copy for OperationIter<R>where R: Copy + Reader,
impl<R> Copy for RangeLists<R>where R: Copy,
impl<R, Offset> Copy for Location<R, Offset>where R: Copy + Reader<Offset = Offset>, Offset: Copy + ReaderOffset,
impl<R, Offset> Copy for Operation<R, Offset>where R: Copy + Reader<Offset = Offset>, Offset: Copy + ReaderOffset,
impl<R, Offset> Copy for Piece<R, Offset>where R: Copy + Reader<Offset = Offset>, Offset: Copy + ReaderOffset,
impl<Storage> Copy for __BindgenBitfieldUnit<Storage>where Storage: Copy,
impl<T> Copy for Bound<T>where T: Copy,
impl<T> Copy for Option<T>where T: Copy,
impl<T> Copy for Poll<T>where T: Copy,
impl<T> Copy for *const Twhere T: ?Sized,
impl<T> Copy for *mut Twhere T: ?Sized,
impl<T> Copy for &Twhere T: ?Sized,
Shared references can be copied, but mutable references cannot!