Trait frame_support::dispatch::marker::Copy 1.0.0[−][src]
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 value
However, 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` may not 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) - Array types, for all sizes, if the item type also implements
Copy(e.g.,[i32; 123456]) - Tuple types, if each component also implements
Copy(e.g.,(),(i32, bool)) - 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.
Implementations on Foreign Types
Shared references can be copied, but mutable references cannot!
impl Copy for OptionBoolimpl<'t> Copy for Match<'t>impl<'t> Copy for Match<'t>impl Copy for MatchKindimpl Copy for MatchKindimpl Copy for Flagimpl Copy for ClassBytesRangeimpl Copy for Positionimpl Copy for Utf8Rangeimpl Copy for Utf8Sequenceimpl Copy for ClassSetBinaryOpKindimpl Copy for ClassUnicodeRangeimpl Copy for Spanimpl Copy for OnceStateimpl Copy for WaitTimeoutResultimpl Copy for UnparkResultimpl Copy for RequeueOpimpl Copy for ParkResultimpl Copy for ParkTokenimpl Copy for UnparkTokenimpl Copy for FilterOpimpl Copy for glob64_timpl Copy for DIRimpl Copy for Elf64_Ehdrimpl Copy for sockaddr_algimpl Copy for ifaddrsimpl Copy for ipv6_mreqimpl Copy for pthread_mutex_timpl Copy for Elf64_Chdrimpl Copy for _libc_fpstateimpl Copy for termios2impl Copy for canfd_frameimpl Copy for statximpl Copy for sockaddr_llimpl Copy for tmimpl Copy for fpos_timpl Copy for dirent64impl Copy for statvfsimpl Copy for sigeventimpl Copy for genlmsghdrimpl Copy for input_keymap_entryimpl Copy for timespecimpl Copy for Elf64_Phdrimpl Copy for termiosimpl Copy for nlmsghdrimpl Copy for __exit_statusimpl Copy for ip_mreq_sourceimpl Copy for sigvalimpl Copy for sockaddr_in6impl Copy for statx_timestampimpl Copy for shmid_dsimpl Copy for FILEimpl Copy for _libc_xmmregimpl Copy for af_alg_ivimpl Copy for fanotify_responseimpl Copy for Elf64_Symimpl Copy for pthread_condattr_timpl Copy for user_regs_structimpl Copy for sockaddrimpl Copy for hostentimpl Copy for arpreqimpl Copy for uinput_ff_uploadimpl Copy for utimbufimpl Copy for uinput_user_devimpl Copy for arphdrimpl Copy for itimervalimpl Copy for msginfoimpl Copy for lingerimpl Copy for mq_attrimpl Copy for sigset_timpl Copy for fd_setimpl Copy for __c_anonymous_sockaddr_can_tpimpl Copy for input_eventimpl Copy for statvfs64impl Copy for sysinfoimpl Copy for posix_spawnattr_timpl Copy for sockaddr_vmimpl Copy for uinput_abs_setupimpl Copy for protoentimpl Copy for itimerspecimpl Copy for ip_mreqnimpl Copy for packet_mreqimpl Copy for nlmsgerrimpl Copy for siginfo_timpl Copy for pthread_rwlock_timpl Copy for cpu_set_timpl Copy for rlimitimpl Copy for glob_timpl Copy for inotify_eventimpl Copy for sockaddr_nlimpl Copy for uinput_ff_eraseimpl Copy for Elf32_Phdrimpl Copy for statfsimpl Copy for sigactionimpl Copy for nl_pktinfoimpl Copy for __c_anonymous_sockaddr_can_j1939impl Copy for sockaddr_storageimpl Copy for userimpl Copy for spwdimpl Copy for ntptimevalimpl Copy for Elf32_Symimpl Copy for ff_periodic_effectimpl Copy for Elf32_Shdrimpl Copy for cmsghdrimpl Copy for user_fpregs_structimpl Copy for in_pktinfoimpl Copy for input_absinfoimpl Copy for ff_rumble_effectimpl Copy for utsnameimpl Copy for ip_mreqimpl Copy for tmsimpl Copy for iovecimpl Copy for pthread_attr_timpl Copy for sock_extended_errimpl Copy for Elf32_Ehdrimpl Copy for ff_condition_effectimpl Copy for _libc_fpxregimpl Copy for msghdrimpl Copy for ff_constant_effectimpl Copy for passwdimpl Copy for sembufimpl Copy for ff_ramp_effectimpl Copy for mcontext_timpl Copy for flock64impl Copy for rusageimpl Copy for can_frameimpl Copy for rtentryimpl Copy for ucontext_timpl Copy for dqblkimpl Copy for timeximpl Copy for fanotify_event_metadataimpl Copy for sched_paramimpl Copy for sockaddr_canimpl Copy for timezoneimpl Copy for sockaddr_unimpl Copy for groupimpl Copy for signalfd_siginfoimpl Copy for epoll_eventimpl Copy for statimpl Copy for ff_replayimpl Copy for in6_pktinfoimpl Copy for in6_rtmsgimpl Copy for timevalimpl Copy for fpos64_timpl Copy for rlimit64impl Copy for uinput_setupimpl Copy for ff_effectimpl Copy for lconvimpl Copy for addrinfoimpl Copy for ipc_permimpl Copy for statfs64impl Copy for Dl_infoimpl Copy for in6_addrimpl Copy for arpreq_oldimpl Copy for sem_timpl Copy for aiocbimpl Copy for can_filterimpl Copy for mntentimpl Copy for input_maskimpl Copy for pthread_mutexattr_timpl Copy for nl_mmap_hdrimpl Copy for regex_timpl Copy for pthread_cond_timpl Copy for ucredimpl Copy for arpd_requestimpl Copy for ff_envelopeimpl Copy for dl_phdr_infoimpl Copy for mallinfoimpl Copy for winsizeimpl Copy for Elf32_Chdrimpl Copy for ff_triggerimpl Copy for pollfdimpl Copy for direntimpl Copy for regmatch_timpl Copy for utmpximpl Copy for __timevalimpl Copy for stack_timpl Copy for fsid_timpl Copy for nl_mmap_reqimpl Copy for stat64impl Copy for serventimpl Copy for sockaddr_inimpl Copy for pthread_rwlockattr_timpl Copy for mmsghdrimpl Copy for __c_anonymous_sockaddr_can_can_addrimpl Copy for flockimpl Copy for posix_spawn_file_actions_timpl Copy for max_align_timpl Copy for nlattrimpl Copy for in_addrimpl Copy for msqid_dsimpl Copy for Elf64_Shdrimpl Copy for input_idimpl Copy for if_nameindeximpl Copy for BigEndianimpl Copy for LittleEndianimpl Copy for Infiximpl Copy for Suffiximpl Copy for Colourimpl Copy for Styleimpl Copy for Prefiximpl Copy for ValueTypeimpl Copy for F32impl Copy for RuntimeValueimpl Copy for F64impl Copy for VarInt64impl Copy for TableTypeimpl Copy for Localimpl Copy for GlobalTypeimpl Copy for VarInt7impl Copy for VarInt32impl Copy for ResizableLimitsimpl Copy for ValueTypeimpl Copy for Uint8impl Copy for BlockTypeimpl Copy for RelocationEntryimpl Copy for Uint32impl Copy for Internalimpl Copy for MemoryTypeimpl Copy for ImportCountTypeimpl Copy for VarUint64impl Copy for TableElementTypeimpl Copy for Externalimpl Copy for VarUint1impl Copy for Uint64impl Copy for Funcimpl Copy for VarUint7impl Copy for VarUint32impl Copy for StackValueTypeimpl Copy for StartedWithimpl Copy for Pagesimpl Copy for Pagesimpl Copy for Bytesimpl Copy for Wordsimpl Copy for Wordsimpl Copy for Errnoimpl Copy for U512impl Copy for H512impl Copy for H128impl Copy for U256impl Copy for H160impl Copy for U128impl Copy for H256impl Copy for FromHexErrorimpl<X> Copy for Uniform<X> where
X: Copy + SampleUniform,
<X as SampleUniform>::Sampler: Copy, impl Copy for vec512_storageimpl Copy for vec256_storageimpl Copy for YesS3impl Copy for NoNIimpl Copy for vec128_storageimpl Copy for NoS3impl Copy for YesS4impl Copy for NoS4impl Copy for YesA1impl Copy for NoA1impl Copy for NoA2impl Copy for YesNIimpl Copy for YesA2impl Copy for FromStrRadixErrKindimpl<T, N> Copy for GenericArray<T, N> where
T: Copy,
N: ArrayLength<T>,
<N as ArrayLength<T>>::ArrayType: Copy, impl Copy for Z0impl Copy for Lessimpl Copy for UTermimpl Copy for B1impl Copy for Equalimpl Copy for B0impl Copy for Greaterimpl Copy for ATermimpl Copy for ZeroPaddingimpl Copy for UnpadErrorimpl Copy for Iso7816impl Copy for AnsiX923impl Copy for NoPaddingimpl Copy for Pkcs7impl Copy for PadErrorimpl Copy for InvalidOutputSizeimpl<X> Copy for Uniform<X> where
X: Copy + SampleUniform,
<X as SampleUniform>::Sampler: Copy, impl Copy for Languageimpl Copy for MnemonicTypeimpl Copy for InvalidKeyLengthimpl Copy for MacErrorimpl Copy for RecoveryIdimpl Copy for InvalidOutputSizeimpl<T, N> Copy for GenericArray<T, N> where
T: Copy,
N: ArrayLength<T>,
<N as ArrayLength<T>>::ArrayType: Copy, impl Copy for InvalidKeyLengthimpl Copy for MacErrorimpl Copy for Choiceimpl Copy for UnpadErrorimpl Copy for PadErrorimpl Copy for u32x4impl Copy for u64x2impl Copy for Errorimpl Copy for ECQVCertPublicimpl Copy for PublicKeyimpl Copy for MultiSignatureStageimpl Copy for ECQVCertSecretimpl Copy for SignatureErrorimpl Copy for ChainCodeimpl Copy for Cosignatureimpl Copy for Signatureimpl Copy for RistrettoBothimpl Copy for Commitmentimpl Copy for VRFOutputimpl Copy for PublicKeyimpl Copy for Blake2bResultimpl Copy for Blake2sResultimpl Copy for XxHash64impl Copy for XxHash32impl Copy for Abortedimpl Copy for PollNextimpl Copy for Canceledimpl<'a> Copy for NodeHandle<'a>impl<'a> Copy for NibbleSlice<'a>impl<T> Copy for MemCounter<T>impl<T> Copy for NoopTracker<T>impl Copy for SectionIdimpl<'abbrev, 'entry, 'unit, R> Copy for AttrsIter<'abbrev, 'entry, 'unit, R> where
R: Copy + Reader, impl Copy for DwAddrimpl Copy for DwDsimpl Copy for FileEntryFormatimpl<R, Offset> Copy for Location<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for AttributeSpecificationimpl<R, Offset> Copy for AttributeValue<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for Errorimpl Copy for Formatimpl Copy for DwUtimpl Copy for LineRowimpl Copy for DwMacroimpl Copy for DwAccessimpl Copy for Valueimpl Copy for Encodingimpl Copy for DwAteimpl Copy for DebugTypeSignatureimpl Copy for DwLnsimpl<R, Offset> Copy for Piece<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for DwIdimpl Copy for DwInlimpl Copy for Armimpl Copy for DwChildrenimpl Copy for ValueTypeimpl Copy for DwTagimpl Copy for DwEhPeimpl<R, Offset> Copy for FileEntry<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for DwOpimpl Copy for DwLnctimpl Copy for DwIdximpl Copy for ReaderOffsetIdimpl Copy for DwVirtualityimpl Copy for ColumnTypeimpl Copy for DwCcimpl Copy for LittleEndianimpl Copy for X86impl Copy for Pointerimpl Copy for DwLleimpl Copy for DwVisimpl Copy for Rangeimpl Copy for DwEndimpl Copy for DwoIdimpl Copy for DwFormimpl Copy for Augmentationimpl Copy for DwLneimpl Copy for DwarfFileTypeimpl<R, Offset> Copy for Operation<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for Registerimpl Copy for DwDscimpl Copy for DwDefaultedimpl Copy for RunTimeEndianimpl Copy for DwLangimpl Copy for DwRleimpl Copy for DwOrdimpl Copy for BigEndianimpl<R, Offset> Copy for LineInstruction<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for LineEncodingimpl<R, Offset> Copy for UnitHeader<R, Offset> where
R: Copy + Reader<Offset = Offset>,
Offset: Copy + ReaderOffset, impl Copy for DwAtimpl Copy for X86_64impl Copy for DwCfaimpl Copy for ImageCoffSymbolsHeaderimpl<'data> Copy for StringTable<'data>impl<'data> Copy for CompressedData<'data>impl Copy for ImageImportByNameimpl Copy for ImageCor20Headerimpl Copy for ImageNtHeaders64impl Copy for ImageDynamicRelocation64impl Copy for ImageResourceDataEntryimpl Copy for ImageOptionalHeader32impl Copy for CompressionFormatimpl<'data, Elf> Copy for SymbolTable<'data, Elf> where
Elf: Copy + FileHeader,
<Elf as FileHeader>::Sym: Copy, impl<'data, 'file> Copy for CoffSymbol<'data, 'file> where
'data: 'file, impl Copy for AnonObjectHeaderV2impl Copy for RelocationEncodingimpl Copy for Headerimpl Copy for ImagePrologueDynamicRelocationHeaderimpl Copy for LittleEndianimpl Copy for SymbolKindimpl Copy for ImageArchiveMemberHeaderimpl Copy for ImageEpilogueDynamicRelocationHeaderimpl Copy for ImageLoadConfigDirectory32impl<'data> Copy for Export<'data>impl Copy for Endiannessimpl Copy for ImageRelocationimpl Copy for ImageExportDirectoryimpl Copy for ScatteredRelocationInfoimpl Copy for ImageAlpha64RuntimeFunctionEntryimpl Copy for ImageArmRuntimeFunctionEntryimpl Copy for Architectureimpl Copy for ImageFunctionEntry64impl<'data, 'file, Elf> Copy for ElfSymbolTable<'data, 'file, Elf> where
'data: 'file,
Elf: Copy + FileHeader,
<Elf as FileHeader>::Endian: Copy, impl Copy for FileFlagsimpl Copy for SymbolIndeximpl<'data> Copy for Import<'data>impl Copy for ImageTlsDirectory64impl Copy for SymbolScopeimpl Copy for ImageAuxSymbolWeakimpl Copy for ImageSymbolimpl Copy for ImageLoadConfigDirectory64impl Copy for Guidimpl Copy for BigEndianimpl Copy for ImageOptionalHeader64impl Copy for ImageDynamicRelocation64V2impl Copy for ImageDebugDirectoryimpl Copy for ImageEnclaveConfig32impl<'data, Elf> Copy for SectionTable<'data, Elf> where
Elf: Copy + FileHeader,
<Elf as FileHeader>::SectionHeader: Copy, impl Copy for ImageAuxSymbolFunctionBeginEndimpl Copy for ImageHotPatchBaseimpl<'data> Copy for Bytes<'data>impl Copy for SectionIndeximpl Copy for ImageLoadConfigCodeIntegrityimpl Copy for NonPagedDebugInfoimpl Copy for ImageSectionHeaderimpl Copy for AnonObjectHeaderimpl Copy for ArchiveKindimpl Copy for SectionKindimpl<'data, 'file> Copy for CoffSymbolTable<'data, 'file> where
'data: 'file, impl Copy for ImageEnclaveConfig64impl Copy for ImageResourceDirectoryEntryimpl Copy for RelocationKindimpl Copy for Identimpl Copy for SymbolSectionimpl Copy for ImageAuxSymbolTokenDefimpl Copy for ImageEnclaveImportimpl Copy for FatHeaderimpl Copy for ImageAuxSymbolFunctionimpl Copy for RelocationTargetimpl Copy for ImageDynamicRelocationTableimpl Copy for ImportObjectHeaderimpl Copy for Errorimpl Copy for ImageBoundForwarderRefimpl Copy for ImageNtHeaders32impl Copy for ImageSymbolBytesimpl Copy for ImageDynamicRelocation32impl Copy for ImageLinenumberimpl Copy for AnonObjectHeaderBigobjimpl Copy for ImageTlsDirectory32impl Copy for ImageHotPatchHashesimpl Copy for ImageOs2Headerimpl Copy for BinaryFormatimpl Copy for ImageSeparateDebugHeaderimpl Copy for ImageSymbolEximpl<'data> Copy for SectionTable<'data>impl Copy for ImageVxdHeaderimpl Copy for ImageResourceDirectoryStringimpl Copy for ImageHotPatchInfoimpl Copy for ImageResourceDirectoryimpl Copy for ImageDebugMiscimpl<'data, 'file, Mach> Copy for MachOSymbol<'data, 'file, Mach> where
Mach: Copy + MachHeader,
<Mach as MachHeader>::Nlist: Copy, impl Copy for ImageAuxSymbolCrcimpl Copy for ImageDataDirectoryimpl Copy for SectionFlagsimpl Copy for ImageResourceDirStringUimpl Copy for FatArch32impl Copy for AddressSizeimpl Copy for ImageAuxSymbolSectionimpl Copy for ImageAlphaRuntimeFunctionEntryimpl Copy for ImageFileHeaderimpl<'data, Mach> Copy for SymbolTable<'data, Mach> where
Mach: Copy + MachHeader,
<Mach as MachHeader>::Nlist: Copy, impl Copy for ImageRomHeadersimpl Copy for ComdatKindimpl Copy for ImageBaseRelocationimpl Copy for ImageDelayloadDescriptorimpl Copy for ImageFunctionEntryimpl Copy for FatArch64impl Copy for ImageArm64RuntimeFunctionEntryimpl<'data> Copy for ObjectMapEntry<'data>impl Copy for ImageRomOptionalHeaderimpl Copy for RelocationInfoimpl Copy for ImageImportDescriptorimpl Copy for ImageDosHeaderimpl<'data, 'file, Elf> Copy for ElfSymbol<'data, 'file, Elf> where
'data: 'file,
Elf: Copy + FileHeader,
<Elf as FileHeader>::Endian: Copy,
<Elf as FileHeader>::Sym: Copy, impl Copy for ImageDynamicRelocation32V2impl<'data> Copy for SymbolMapName<'data>impl<'data, 'file, Mach> Copy for MachOSymbolTable<'data, 'file, Mach> where
Mach: Copy + MachHeader, impl Copy for ImageRuntimeFunctionEntryimpl Copy for ImageArchitectureEntryimpl Copy for ImageSymbolExBytesimpl Copy for ImageBoundImportDescriptorimpl Copy for DataFormatimpl Copy for MZFlushimpl Copy for MZStatusimpl Copy for TDEFLStatusimpl Copy for TDEFLFlushimpl Copy for CompressionLevelimpl Copy for TINFLStatusimpl Copy for MZErrorimpl Copy for CompressionStrategyimpl Copy for StreamResultimpl<Info> Copy for DispatchErrorWithPostInfo<Info> where
Info: Copy + Eq + PartialEq<Info> + Clone + Encode + Decode + Printable,