Module core::intrinsics
source · core_intrinsics
)Expand description
编译器内部函数。
相应的定义在 https://github.com/rust-lang/rust/blob/master/compiler/rustc_codegen_llvm/src/intrinsic.rs 中。 相应的常量实现在 https://github.com/rust-lang/rust/blob/master/compiler/rustc_const_eval/src/interpret/intrinsics.rs 中。
常量内部函数
Note: 对内部函数常量的任何更改都应与语言团队讨论。 这包括常量稳定性的变化。
为了使内部函数在编译时可用,需要将实现从 https://github.com/rust-lang/miri/blob/master/src/shims/intrinsics.rs 复制到 https://github.com/rust-lang/rust/blob/master/compiler/rustc_const_eval/src/interpret/intrinsics.rs 并将 #[rustc_const_unstable(feature = "const_such_and_such", issue = "01234")]
添加到函数声明中。
如果应该从具有 rustc_const_stable
属性的 const fn
使用内部函数,则内部函数的属性也必须为 rustc_const_stable
。如果没有 T-lang 协商会,就不应该进行此类更改,因为它把一个特性融入到语言中,如果没有编译器支持,就不能在用户代码中复制。
Volatiles
volatile 内部函数提供旨在作用于 I/O 内存的操作,并保证编译器不会在其他 volatile 内部函数之间对它们进行重新排序。请参见 [volatile] 上的 LLVM 文档。
Atomics
原子内部函数对机器字提供常见的原子操作,并具有多种可能的存储顺序。它们遵循与 C++ 11 相同的语义。请参见 [atomics] 上的 LLVM 文档。
关于内存排序的快速回顾:
- 获取 - 获取锁的障碍。屏障之后将进行后续的读取和写入。
- 释放 - 释放锁的障碍物。之前的读取和写入发生在该屏障之前。
- 顺序一致 - 顺序一致的操作可保证按顺序进行。这是处理原子类型的标准模式,等效于 Java 的
volatile
。
Modules
- mirExperimentalRustc 用于手写 MIR 的内部工具。
Functions
- abortExperimental中止进程的执行。
- add_with_overflowExperimental执行检查的整数加法。
- arith_offset⚠Experimental计算与指针的偏移量 (可能会自动换行)。
- assert_inhabitedExperimental如果
T
未定义,则无法执行的不安全函数的守卫: 这将静态地为 panic,或者什么也不做。 - assert_mem_uninitialized_validExperimental
std::mem::uninitialized
的守卫。这将静态地为 panic,或者什么也不做。 - assert_zero_validExperimental如果
T
不允许零初始化,则永远不能执行的不安全函数的守卫:这将静态 panic,或者什么也不做。 - assume⚠Experimental通知优化器某个条件始终为 true。 如果条件为 false,则行为未定义的。
- atomic_and_acqrel⚠Experimental对当前值按位与,返回前一个值。
- atomic_and_acquire⚠Experimental对当前值按位与,返回前一个值。
- atomic_and_relaxed⚠Experimental对当前值按位与,返回前一个值。
- atomic_and_release⚠Experimental对当前值按位与,返回前一个值。
- atomic_and_seqcst⚠Experimental对当前值按位与,返回前一个值。
- atomic_cxchg_acqrel_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_acqrel_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_acqrel_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_acquire_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_acquire_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_acquire_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_relaxed_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_relaxed_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_relaxed_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_release_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_release_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_release_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_seqcst_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_seqcst_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchg_seqcst_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_acqrel_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_acqrel_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_acqrel_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_acquire_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_acquire_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_acquire_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_relaxed_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_relaxed_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_relaxed_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_release_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_release_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_release_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_seqcst_acquire⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_seqcst_relaxed⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_cxchgweak_seqcst_seqcst⚠Experimental如果当前值与
old
值相同,则存储一个值。 - atomic_fence_acqrel⚠Experimental原子栅栏。
- atomic_fence_acquire⚠Experimental原子栅栏。
- atomic_fence_release⚠Experimental原子栅栏。
- atomic_fence_seqcst⚠Experimental原子栅栏。
- atomic_load_acquire⚠Experimental加载指针的当前值。
- atomic_load_relaxed⚠Experimental加载指针的当前值。
- atomic_load_seqcst⚠Experimental加载指针的当前值。
- atomic_load_unordered⚠Experimental
- atomic_max_acqrel⚠Experimental使用带符号的比较将当前值设为最大值。
- atomic_max_acquire⚠Experimental使用带符号的比较将当前值设为最大值。
- atomic_max_relaxed⚠Experimental当前值的最大值。
- atomic_max_release⚠Experimental使用带符号的比较将当前值设为最大值。
- atomic_max_seqcst⚠Experimental使用带符号的比较将当前值设为最大值。
- atomic_min_acqrel⚠Experimental使用带符号的比较将当前值设为最小值。
- atomic_min_acquire⚠Experimental使用带符号的比较将当前值设为最小值。
- atomic_min_relaxed⚠Experimental使用带符号的比较将当前值设为最小值。
- atomic_min_release⚠Experimental使用带符号的比较将当前值设为最小值。
- atomic_min_seqcst⚠Experimental使用带符号的比较将当前值设为最小值。
- atomic_nand_acqrel⚠Experimental对当前值按位与,返回前一个值。
- atomic_nand_acquire⚠Experimental对当前值按位与,返回前一个值。
- atomic_nand_relaxed⚠Experimental对当前值按位与,返回前一个值。
- atomic_nand_release⚠Experimental对当前值按位与,返回前一个值。
- atomic_nand_seqcst⚠Experimental对当前值按位与,返回前一个值。
- atomic_or_acqrel⚠Experimental按位或具有当前值,返回前一个值。
- atomic_or_acquire⚠Experimental按位或具有当前值,返回前一个值。
- atomic_or_relaxed⚠Experimental按位或具有当前值,返回前一个值。
- atomic_or_release⚠Experimental按位或具有当前值,返回前一个值。
- atomic_or_seqcst⚠Experimental按位或具有当前值,返回前一个值。
- atomic_singlethreadfence_acqrel⚠Experimental仅编译器的内存屏障。
- atomic_singlethreadfence_acquire⚠Experimental仅编译器的内存屏障。
- atomic_singlethreadfence_release⚠Experimental仅编译器的内存屏障。
- atomic_singlethreadfence_seqcst⚠Experimental仅编译器的内存屏障。
- atomic_store_relaxed⚠Experimental将值存储在指定的存储位置。
- atomic_store_release⚠Experimental将值存储在指定的存储位置。
- atomic_store_seqcst⚠Experimental将值存储在指定的存储位置。
- atomic_store_unordered⚠Experimental
- atomic_umax_acqrel⚠Experimental使用无符号比较将当前值设为最大值。
- atomic_umax_acquire⚠Experimental使用无符号比较将当前值设为最大值。
- atomic_umax_relaxed⚠Experimental使用无符号比较将当前值设为最大值。
- atomic_umax_release⚠Experimental使用无符号比较将当前值设为最大值。
- atomic_umax_seqcst⚠Experimental使用无符号比较将当前值设为最大值。
- atomic_umin_acqrel⚠Experimental使用无符号比较,使用当前值的最小值。
- atomic_umin_acquire⚠Experimental使用无符号比较,使用当前值的最小值。
- atomic_umin_relaxed⚠Experimental使用无符号比较,使用当前值的最小值。
- atomic_umin_release⚠Experimental使用无符号比较,使用当前值的最小值。
- atomic_umin_seqcst⚠Experimental使用无符号比较,使用当前值的最小值。
- atomic_xadd_acqrel⚠Experimental加到当前值,返回前一个值。
- atomic_xadd_acquire⚠Experimental加到当前值,返回前一个值。
- atomic_xadd_relaxed⚠Experimental加到当前值,返回前一个值。
- atomic_xadd_release⚠Experimental加到当前值,返回前一个值。
- atomic_xadd_seqcst⚠Experimental加到当前值,返回前一个值。
- atomic_xchg_acqrel⚠Experimental将值存储在指定的内存位置,并返回旧值。
- atomic_xchg_acquire⚠Experimental将值存储在指定的内存位置,并返回旧值。
- atomic_xchg_relaxed⚠Experimental将值存储在指定的内存位置,并返回旧值。
- atomic_xchg_release⚠Experimental将值存储在指定的内存位置,并返回旧值。
- atomic_xchg_seqcst⚠Experimental将值存储在指定的内存位置,并返回旧值。
- atomic_xor_acqrel⚠Experimental与当前值按位异或,返回前一个值。
- atomic_xor_acquire⚠Experimental与当前值按位异或,返回前一个值。
- atomic_xor_relaxed⚠Experimental与当前值按位异或,返回前一个值。
- atomic_xor_release⚠Experimental与当前值按位异或,返回前一个值。
- atomic_xor_seqcst⚠Experimental与当前值按位异或,返回前一个值。
- atomic_xsub_acqrel⚠Experimental从当前值减去,返回前一个值。
- atomic_xsub_acquire⚠Experimental从当前值减去,返回前一个值。
- atomic_xsub_relaxed⚠Experimental从当前值减去,返回前一个值。
- atomic_xsub_release⚠Experimental从当前值减去,返回前一个值。
- atomic_xsub_seqcst⚠Experimental从当前值减去,返回前一个值。
- bitreverseExperimental反转整数类型
T
中的位。 - black_boxExperimental有关详细信息,请参见
std::hint::black_box
的文档。 - breakpoint⚠Experimental执行一个断点陷阱,以供调试器检查。
- bswapExperimental反转整数类型
T
中的字节。 - caller_locationExperimental获取对静态
Location
的引用,以指示在何处调用了它。 - ceilf32⚠Experimental返回大于或等于
f32
的最小整数。 - ceilf64⚠Experimental返回大于或等于
f64
的最小整数。 - const_allocate⚠Experimental在编译时分配一块内存。 在运行时,只返回一个空指针。
- const_deallocate⚠Experimental释放在编译时由
intrinsics::const_allocate
分配的内存。 在运行时,什么都不做。 - const_eval_select⚠Experimental根据上下文选择要调用的函数。
- copysignf32⚠Experimental将
f32
值的符号从y
复制到x
。 - copysignf64⚠Experimental将
f64
值的符号从y
复制到x
。 - cosf32⚠Experimental返回
f32
的余弦值。 - cosf64⚠Experimental返回
f64
的余弦值。 - ctlzExperimental返回整数类型
T
的前导未设置位 (zeroes) 的数量。 - ctlz_nonzero⚠Experimental类似于
ctlz
,但是非常不安全,因为当给定值0
的x
时,它返回undef
。 - ctpopExperimental返回整数类型
T
中设置的位数 - cttzExperimental返回整数类型
T
的尾随未设置位 (zeroes) 的数量。 - cttz_nonzero⚠Experimental类似于
cttz
,但是非常不安全,因为当给定值0
的x
时,它返回undef
。 - discriminant_valueExperimental返回 ‘v’ 中变体的判别式的值; 如果
T
没有判别,则返回0
。 - exact_div⚠Experimental执行精确除法,从而导致
x % y != 0
或y == 0
或x == T::MIN && y == -1
出现不确定的行为 - exp2f32⚠Experimental返回 2 乘以
f32
的幂。 - exp2f64⚠Experimental返回 2 乘以
f64
的幂。 - expf32⚠Experimental返回
f32
的指数。 - expf64⚠Experimental返回
f64
的指数。 - fabsf32⚠Experimental返回
f32
的绝对值。 - fabsf64⚠Experimental返回
f64
的绝对值。 - fadd_fast⚠Experimental浮点数加法允许基于代数规则进行优化。 可以假设输入是有限的。
- fdiv_fast⚠Experimental浮点除法允许基于代数规则进行优化。 可以假设输入是有限的。
- float_to_int_unchecked⚠Experimental使用 LLVM 的 fptoui/fptosi 进行转换,对于越界的值可能会返回 undef (https://github.com/rust-lang/rust/issues/10184)
- floorf32⚠Experimental返回小于或等于
f32
的最大整数。 - floorf64⚠Experimental返回小于或等于
f64
的最大整数。 - fmaf32⚠Experimental为
f32
值返回a * b + c
。 - fmaf64⚠Experimental为
f64
值返回a * b + c
。 - fmul_fast⚠Experimental浮点乘法允许基于代数规则进行优化。 可以假设输入是有限的。
- forgetExperimental将值移出作用域。而无需运行丢弃守卫。
- frem_fast⚠Experimental浮余数允许基于代数规则进行优化。 可以假设输入是有限的。
- fsub_fast⚠Experimental浮点减法允许基于代数规则进行优化。 可以假设输入是有限的。
- likelyExperimental提示编译器分支条件很可能是正确的。 返回传递给它的值。
- log2f32⚠Experimental返回
f32
的以 2 为底的对数。 - log2f64⚠Experimental返回
f64
的以 2 为底的对数。 - log10f32⚠Experimental返回
f32
的以 10 为底的对数。 - log10f64⚠Experimental返回
f64
的以 10 为底的对数。 - logf32⚠Experimental返回
f32
的自然对数。 - logf64⚠Experimental返回
f64
的自然对数。 - maxnumf32Experimental返回两个
f32
值的最大值。 - maxnumf64Experimental返回两个
f64
值的最大值。 - min_align_ofExperimental类型的最小对齐方式。
- min_align_of_val⚠Experimental参考值的所需对齐方式。
- minnumf32Experimental返回两个
f32
值中的最小值。 - minnumf64Experimental返回两个
f64
值中的最小值。 - mul_with_overflowExperimental执行检查的整数乘法
- nearbyintf32⚠Experimental返回最接近
f32
的整数。 - nearbyintf64⚠Experimental返回最接近
f64
的整数。 - needs_dropExperimental如果
T
给出的实际类型需要丢弃 glue,则返回true
。如果为T
提供的实际类型实现Copy
,则返回false
。 - nontemporal_store⚠Experimental根据 LLVM 发出
!nontemporal
存储 (请参见其文档)。 可能永远都不会变得稳定。 - offset⚠Experimental计算与指针的偏移量。
- option_payload_ptr⚠Experimental此方法创建指向任何
Some
值的指针。 如果参数是None
,则返回一个无效的边界内指针 (对于创建一个空切片来说仍然可以接受)。 - powf32⚠Experimental将
f32
提升到f32
的幂。 - powf64⚠Experimental将
f64
提升到f64
的幂。 - powif32⚠Experimental将
f32
提升为整数幂。 - powif64⚠Experimental将
f64
提升为整数幂。 - pref_align_of⚠Experimental类型的首选对齐方式。
- prefetch_read_data⚠Experimental
prefetch
内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。 - prefetch_read_instruction⚠Experimental
prefetch
内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。 - prefetch_write_data⚠Experimental
prefetch
内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。 - prefetch_write_instruction⚠Experimental
prefetch
内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。 - ptr_guaranteed_cmpExperimental有关详细信息,请参见
<*const T>::guaranteed_eq
的文档。 如果结果未知,则返回2
。 如果保证指针相等,则返回1
如果保证指针不相等,则返回0
- ptr_maskExperimental根据掩码屏蔽指针的位。
- ptr_offset_from⚠Experimental有关详细信息,请参见
<*const T>::offset_from
的文档。 - ptr_offset_from_unsigned⚠Experimental有关详细信息,请参见
<*const T>::sub_ptr
的文档。 - raw_eq⚠Experimental确定两个值的原始字节是否相等。
- read_via_copy⚠Experimental这是
crate::ptr::read
的实现细节,不应在其他任何地方使用。请参见其评论以了解其存在的原因。 - rintf32⚠Experimental返回最接近
f32
的整数。 如果参数不是整数,则可能会引发不精确的浮点异常。 - rintf64⚠Experimental返回最接近
f64
的整数。 如果参数不是整数,则可能会引发不精确的浮点异常。 - rotate_leftExperimental向左旋转。
- rotate_rightExperimental向右旋转。
- roundevenf32⚠Experimental返回最接近
f32
的整数。 将中途个案四舍五入到具有最低有效数字的数字。 - roundevenf64⚠Experimental返回最接近
f64
的整数。 将中途个案四舍五入到具有最低有效数字的数字。 - roundf32⚠Experimental返回最接近
f32
的整数。在离零一半的情况下进行舍入。 - roundf64⚠Experimental返回最接近
f64
的整数。在离零一半的情况下进行舍入。 - rustc_peekExperimental从函数附带的属性中获取其含义的 magic 内部函数。
- saturating_addExperimental计算
a + b
,在数字范围内达到饱和。 - saturating_subExperimental计算
a - b
,在数字范围内达到饱和。 - sinf32⚠Experimental返回
f32
的正弦值。 - sinf64⚠Experimental返回
f64
的正弦值。 - size_ofExperimental类型的大小 (以字节为单位)。
- size_of_val⚠Experimental引用值的大小 (以字节为单位)。
- sqrtf32⚠Experimental返回
f32
的平方根 - sqrtf64⚠Experimental返回
f64
的平方根 - sub_with_overflowExperimental执行检查的整数减法
- transmute_unchecked⚠Experimental与
transmute
类似,但在编译时检查得更少: 它不会为size_of::<Src>() != size_of::<Dst>()
报错,而是在运行时出现 Undefined Behaviour。 - truncf32⚠Experimental返回
f32
的整数部分。 - truncf64⚠Experimental返回
f64
的整数部分。 - try⚠ExperimentalRust 的 “try catch” 构造使用数据指针
data
调用函数指针try_fn
。 - type_idExperimental获取一个标识符,该标识符对于指定的类型是全局唯一的。 无论调用哪个 crate,此函数都将为类型返回相同的值。
- type_nameExperimental获取包含类型名称的静态字符串切片。
- unaligned_volatile_load⚠Experimental从
src
指针执行易失性加载不需要将指针对齐。 - unaligned_volatile_store⚠Experimental对
dst
指针执行易失性存储。 指针不需要对齐。 - unchecked_add⚠Experimental返回未经检查的加法运算的结果,导致
x + y > T::MAX
或x + y < T::MIN
出现不确定的行为。 - unchecked_div⚠Experimental执行未经检查的除法,从而导致
y == 0
或x == T::MIN && y == -1
出现不确定的行为 - unchecked_mul⚠Experimental返回未经检查的乘法的结果,当
x *y > T::MAX
或x* y < T::MIN
时导致未定义的行为。 - unchecked_rem⚠Experimental返回未经检查的除法的其余部分,从而在
y == 0
或x == T::MIN && y == -1
时导致未定义的行为 - unchecked_shl⚠Experimental执行未经检查的左移,导致
y < 0
或y >= N
出现不确定的行为,其中 N 是 T 的宽度 (以位为单位)。 - unchecked_shr⚠Experimental执行未经检查的右移,导致
y < 0
或y >= N
出现不确定的行为,其中 N 是 T 的宽度 (以位为单位)。 - unchecked_sub⚠Experimental返回未经检查的减法的结果,当
x - y > T::MAX
或x - y < T::MIN
时导致未定义的行为。 - unlikelyExperimental提示编译器分支条件可能为 false。 返回传递给它的值。
- unreachable⚠Experimental通知优化器代码中的这一点不可访问,从而可以进行进一步的优化。
- variant_countExperimental返回
T
类型强制转换为usize
的变体的数量; 如果T
没有变体,则返回0
。无人居住的变体将被计算在内。 - volatile_copy_memory⚠Experimental相当于适当的
llvm.memmove.p0i8.0i8.*
内部函数,大小为count * size_of::<T>()
,对齐方式为min_align_of::<T>()
- volatile_copy_nonoverlapping_memory⚠Experimental相当于适当的
llvm.memcpy.p0i8.0i8.*
内部函数,大小为count
*size_of::<T>()
,对齐方式为min_align_of::<T>()
- volatile_load⚠Experimental从
src
指针执行易失性加载。 - volatile_set_memory⚠Experimental等效于适当的
llvm.memset.p0i8.*
内部函数,其大小为count* size_of::<T>()
,并且对齐方式为min_align_of::<T>()
。 - volatile_store⚠Experimental对
dst
指针执行易失性存储。 - vtable_align⚠Experimental
ptr
必须指向 vtable。 内部函数将返回存储在 vtable 中的对齐方式。 - vtable_size⚠Experimental
ptr
必须指向 vtable。 内部函数将返回存储在 vtable 中的大小。 - wrapping_addExperimental返回 (a + b) mod 2 N,其中 N 是 T 的宽度 (以位为单位)。
- wrapping_mulExperimental返回 (a * b) mod 2 N,其中 N 是 T 的宽度 (以位为单位)。
- wrapping_subExperimental返回 (a-b) mod 2 N,其中 N 是 T 的宽度 (以位为单位)。
- write_via_move⚠Experimental这是
crate::ptr::write
的实现细节,不应在其他任何地方使用。请参见其评论以了解其存在的原因。 - copy⚠将
count * size_of::<T>()
字节从src
复制到dst
。源和目标可能会重叠。 - 将
count * size_of::<T>()
字节从src
复制到dst
。源和目标必须不重叠。 - drop_in_place⚠Deprecated
- 将一种类型的值的位重新解释为另一种类型。
- 将从
dst
开始的count * size_of::<T>()
内存字节设置为val
。