Module core::intrinsics

source ·
🔬This is a nightly-only experimental API. (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

  • mirExperimental
    Rustc 用于手写 MIR 的内部工具。

Functions

  • abortExperimental
    中止进程的执行。
  • add_with_overflowExperimental
    执行检查的整数加法。
  • arith_offsetExperimental
    计算与指针的偏移量 (可能会自动换行)。
  • assert_inhabitedExperimental
    如果 T 未定义,则无法执行的不安全函数的守卫: 这将静态地为 panic,或者什么也不做。
  • std::mem::uninitialized 的守卫。这将静态地为 panic,或者什么也不做。
  • assert_zero_validExperimental
    如果 T 不允许零初始化,则永远不能执行的不安全函数的守卫:这将静态 panic,或者什么也不做。
  • assumeExperimental
    通知优化器某个条件始终为 true。 如果条件为 false,则行为未定义的。
  • atomic_and_acqrelExperimental
    对当前值按位与,返回前一个值。
  • atomic_and_acquireExperimental
    对当前值按位与,返回前一个值。
  • atomic_and_relaxedExperimental
    对当前值按位与,返回前一个值。
  • atomic_and_releaseExperimental
    对当前值按位与,返回前一个值。
  • atomic_and_seqcstExperimental
    对当前值按位与,返回前一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • 如果当前值与 old 值相同,则存储一个值。
  • atomic_fence_acqrelExperimental
    原子栅栏。
  • atomic_fence_acquireExperimental
    原子栅栏。
  • atomic_fence_releaseExperimental
    原子栅栏。
  • atomic_fence_seqcstExperimental
    原子栅栏。
  • atomic_load_acquireExperimental
    加载指针的当前值。
  • atomic_load_relaxedExperimental
    加载指针的当前值。
  • atomic_load_seqcstExperimental
    加载指针的当前值。
  • atomic_load_unorderedExperimental
  • atomic_max_acqrelExperimental
    使用带符号的比较将当前值设为最大值。
  • atomic_max_acquireExperimental
    使用带符号的比较将当前值设为最大值。
  • atomic_max_relaxedExperimental
    当前值的最大值。
  • atomic_max_releaseExperimental
    使用带符号的比较将当前值设为最大值。
  • atomic_max_seqcstExperimental
    使用带符号的比较将当前值设为最大值。
  • atomic_min_acqrelExperimental
    使用带符号的比较将当前值设为最小值。
  • atomic_min_acquireExperimental
    使用带符号的比较将当前值设为最小值。
  • atomic_min_relaxedExperimental
    使用带符号的比较将当前值设为最小值。
  • atomic_min_releaseExperimental
    使用带符号的比较将当前值设为最小值。
  • atomic_min_seqcstExperimental
    使用带符号的比较将当前值设为最小值。
  • atomic_nand_acqrelExperimental
    对当前值按位与,返回前一个值。
  • atomic_nand_acquireExperimental
    对当前值按位与,返回前一个值。
  • atomic_nand_relaxedExperimental
    对当前值按位与,返回前一个值。
  • atomic_nand_releaseExperimental
    对当前值按位与,返回前一个值。
  • atomic_nand_seqcstExperimental
    对当前值按位与,返回前一个值。
  • atomic_or_acqrelExperimental
    按位或具有当前值,返回前一个值。
  • atomic_or_acquireExperimental
    按位或具有当前值,返回前一个值。
  • atomic_or_relaxedExperimental
    按位或具有当前值,返回前一个值。
  • atomic_or_releaseExperimental
    按位或具有当前值,返回前一个值。
  • atomic_or_seqcstExperimental
    按位或具有当前值,返回前一个值。
  • 仅编译器的内存屏障。
  • 仅编译器的内存屏障。
  • 仅编译器的内存屏障。
  • 仅编译器的内存屏障。
  • atomic_store_relaxedExperimental
    将值存储在指定的存储位置。
  • atomic_store_releaseExperimental
    将值存储在指定的存储位置。
  • atomic_store_seqcstExperimental
    将值存储在指定的存储位置。
  • atomic_store_unorderedExperimental
  • atomic_umax_acqrelExperimental
    使用无符号比较将当前值设为最大值。
  • atomic_umax_acquireExperimental
    使用无符号比较将当前值设为最大值。
  • atomic_umax_relaxedExperimental
    使用无符号比较将当前值设为最大值。
  • atomic_umax_releaseExperimental
    使用无符号比较将当前值设为最大值。
  • atomic_umax_seqcstExperimental
    使用无符号比较将当前值设为最大值。
  • atomic_umin_acqrelExperimental
    使用无符号比较,使用当前值的最小值。
  • atomic_umin_acquireExperimental
    使用无符号比较,使用当前值的最小值。
  • atomic_umin_relaxedExperimental
    使用无符号比较,使用当前值的最小值。
  • atomic_umin_releaseExperimental
    使用无符号比较,使用当前值的最小值。
  • atomic_umin_seqcstExperimental
    使用无符号比较,使用当前值的最小值。
  • atomic_xadd_acqrelExperimental
    加到当前值,返回前一个值。
  • atomic_xadd_acquireExperimental
    加到当前值,返回前一个值。
  • atomic_xadd_relaxedExperimental
    加到当前值,返回前一个值。
  • atomic_xadd_releaseExperimental
    加到当前值,返回前一个值。
  • atomic_xadd_seqcstExperimental
    加到当前值,返回前一个值。
  • atomic_xchg_acqrelExperimental
    将值存储在指定的内存位置,并返回旧值。
  • atomic_xchg_acquireExperimental
    将值存储在指定的内存位置,并返回旧值。
  • atomic_xchg_relaxedExperimental
    将值存储在指定的内存位置,并返回旧值。
  • atomic_xchg_releaseExperimental
    将值存储在指定的内存位置,并返回旧值。
  • atomic_xchg_seqcstExperimental
    将值存储在指定的内存位置,并返回旧值。
  • atomic_xor_acqrelExperimental
    与当前值按位异或,返回前一个值。
  • atomic_xor_acquireExperimental
    与当前值按位异或,返回前一个值。
  • atomic_xor_relaxedExperimental
    与当前值按位异或,返回前一个值。
  • atomic_xor_releaseExperimental
    与当前值按位异或,返回前一个值。
  • atomic_xor_seqcstExperimental
    与当前值按位异或,返回前一个值。
  • atomic_xsub_acqrelExperimental
    从当前值减去,返回前一个值。
  • atomic_xsub_acquireExperimental
    从当前值减去,返回前一个值。
  • atomic_xsub_relaxedExperimental
    从当前值减去,返回前一个值。
  • atomic_xsub_releaseExperimental
    从当前值减去,返回前一个值。
  • atomic_xsub_seqcstExperimental
    从当前值减去,返回前一个值。
  • bitreverseExperimental
    反转整数类型 T 中的位。
  • black_boxExperimental
    有关详细信息,请参见 std::hint::black_box 的文档。
  • breakpointExperimental
    执行一个断点陷阱,以供调试器检查。
  • bswapExperimental
    反转整数类型 T 中的字节。
  • caller_locationExperimental
    获取对静态 Location 的引用,以指示在何处调用了它。
  • ceilf32Experimental
    返回大于或等于 f32 的最小整数。
  • ceilf64Experimental
    返回大于或等于 f64 的最小整数。
  • const_allocateExperimental
    在编译时分配一块内存。 在运行时,只返回一个空指针。
  • const_deallocateExperimental
    释放在编译时由 intrinsics::const_allocate 分配的内存。 在运行时,什么都不做。
  • const_eval_selectExperimental
    根据上下文选择要调用的函数。
  • copysignf32Experimental
    f32 值的符号从 y 复制到 x
  • copysignf64Experimental
    f64 值的符号从 y 复制到 x
  • cosf32Experimental
    返回 f32 的余弦值。
  • cosf64Experimental
    返回 f64 的余弦值。
  • ctlzExperimental
    返回整数类型 T 的前导未设置位 (zeroes) 的数量。
  • ctlz_nonzeroExperimental
    类似于 ctlz,但是非常不安全,因为当给定值 0x 时,它返回 undef
  • ctpopExperimental
    返回整数类型 T 中设置的位数
  • cttzExperimental
    返回整数类型 T 的尾随未设置位 (zeroes) 的数量。
  • cttz_nonzeroExperimental
    类似于 cttz,但是非常不安全,因为当给定值 0x 时,它返回 undef
  • discriminant_valueExperimental
    返回 ‘v’ 中变体的判别式的值; 如果 T 没有判别,则返回 0
  • exact_divExperimental
    执行精确除法,从而导致 x % y != 0y == 0x == T::MIN && y == -1 出现不确定的行为
  • exp2f32Experimental
    返回 2 乘以 f32 的幂。
  • exp2f64Experimental
    返回 2 乘以 f64 的幂。
  • expf32Experimental
    返回 f32 的指数。
  • expf64Experimental
    返回 f64 的指数。
  • fabsf32Experimental
    返回 f32 的绝对值。
  • fabsf64Experimental
    返回 f64 的绝对值。
  • fadd_fastExperimental
    浮点数加法允许基于代数规则进行优化。 可以假设输入是有限的。
  • fdiv_fastExperimental
    浮点除法允许基于代数规则进行优化。 可以假设输入是有限的。
  • float_to_int_uncheckedExperimental
    使用 LLVM 的 fptoui/fptosi 进行转换,对于越界的值可能会返回 undef (https://github.com/rust-lang/rust/issues/10184)
  • floorf32Experimental
    返回小于或等于 f32 的最大整数。
  • floorf64Experimental
    返回小于或等于 f64 的最大整数。
  • fmaf32Experimental
    f32 值返回 a * b + c
  • fmaf64Experimental
    f64 值返回 a * b + c
  • fmul_fastExperimental
    浮点乘法允许基于代数规则进行优化。 可以假设输入是有限的。
  • forgetExperimental
    将值移出作用域。而无需运行丢弃守卫。
  • frem_fastExperimental
    浮余数允许基于代数规则进行优化。 可以假设输入是有限的。
  • fsub_fastExperimental
    浮点减法允许基于代数规则进行优化。 可以假设输入是有限的。
  • likelyExperimental
    提示编译器分支条件很可能是正确的。 返回传递给它的值。
  • log2f32Experimental
    返回 f32 的以 2 为底的对数。
  • log2f64Experimental
    返回 f64 的以 2 为底的对数。
  • log10f32Experimental
    返回 f32 的以 10 为底的对数。
  • log10f64Experimental
    返回 f64 的以 10 为底的对数。
  • logf32Experimental
    返回 f32 的自然对数。
  • logf64Experimental
    返回 f64 的自然对数。
  • maxnumf32Experimental
    返回两个 f32 值的最大值。
  • maxnumf64Experimental
    返回两个 f64 值的最大值。
  • min_align_ofExperimental
    类型的最小对齐方式。
  • min_align_of_valExperimental
    参考值的所需对齐方式。
  • minnumf32Experimental
    返回两个 f32 值中的最小值。
  • minnumf64Experimental
    返回两个 f64 值中的最小值。
  • mul_with_overflowExperimental
    执行检查的整数乘法
  • nearbyintf32Experimental
    返回最接近 f32 的整数。
  • nearbyintf64Experimental
    返回最接近 f64 的整数。
  • needs_dropExperimental
    如果 T 给出的实际类型需要丢弃 glue,则返回 true。如果为 T 提供的实际类型实现 Copy,则返回 false
  • nontemporal_storeExperimental
    根据 LLVM 发出 !nontemporal 存储 (请参见其文档)。 可能永远都不会变得稳定。
  • offsetExperimental
    计算与指针的偏移量。
  • option_payload_ptrExperimental
    此方法创建指向任何 Some 值的指针。 如果参数是 None,则返回一个无效的边界内指针 (对于创建一个空切片来说仍然可以接受)。
  • powf32Experimental
    f32 提升到 f32 的幂。
  • powf64Experimental
    f64 提升到 f64 的幂。
  • powif32Experimental
    f32 提升为整数幂。
  • powif64Experimental
    f64 提升为整数幂。
  • pref_align_ofExperimental
    类型的首选对齐方式。
  • prefetch_read_dataExperimental
    prefetch 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • prefetch 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • prefetch_write_dataExperimental
    prefetch 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • prefetch 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • ptr_guaranteed_cmpExperimental
    有关详细信息,请参见 <*const T>::guaranteed_eq 的文档。 如果结果未知,则返回 2。 如果保证指针相等,则返回 1 如果保证指针不相等,则返回 0
  • ptr_maskExperimental
    根据掩码屏蔽指针的位。
  • ptr_offset_fromExperimental
    有关详细信息,请参见 <*const T>::offset_from 的文档。
  • 有关详细信息,请参见 <*const T>::sub_ptr 的文档。
  • raw_eqExperimental
    确定两个值的原始字节是否相等。
  • read_via_copyExperimental
    这是 crate::ptr::read 的实现细节,不应在其他任何地方使用。请参见其评论以了解其存在的原因。
  • rintf32Experimental
    返回最接近 f32 的整数。 如果参数不是整数,则可能会引发不精确的浮点异常。
  • rintf64Experimental
    返回最接近 f64 的整数。 如果参数不是整数,则可能会引发不精确的浮点异常。
  • rotate_leftExperimental
    向左旋转。
  • rotate_rightExperimental
    向右旋转。
  • roundevenf32Experimental
    返回最接近 f32 的整数。 将中途个案四舍五入到具有最低有效数字的数字。
  • roundevenf64Experimental
    返回最接近 f64 的整数。 将中途个案四舍五入到具有最低有效数字的数字。
  • roundf32Experimental
    返回最接近 f32 的整数。在离零一半的情况下进行舍入。
  • roundf64Experimental
    返回最接近 f64 的整数。在离零一半的情况下进行舍入。
  • rustc_peekExperimental
    从函数附带的属性中获取其含义的 magic 内部函数。
  • saturating_addExperimental
    计算 a + b,在数字范围内达到饱和。
  • saturating_subExperimental
    计算 a - b,在数字范围内达到饱和。
  • sinf32Experimental
    返回 f32 的正弦值。
  • sinf64Experimental
    返回 f64 的正弦值。
  • size_ofExperimental
    类型的大小 (以字节为单位)。
  • size_of_valExperimental
    引用值的大小 (以字节为单位)。
  • sqrtf32Experimental
    返回 f32 的平方根
  • sqrtf64Experimental
    返回 f64 的平方根
  • sub_with_overflowExperimental
    执行检查的整数减法
  • transmute_uncheckedExperimental
    transmute 类似,但在编译时检查得更少: 它不会为 size_of::<Src>() != size_of::<Dst>() 报错,而是在运行时出现 Undefined Behaviour
  • truncf32Experimental
    返回 f32 的整数部分。
  • truncf64Experimental
    返回 f64 的整数部分。
  • tryExperimental
    Rust 的 “try catch” 构造使用数据指针 data 调用函数指针 try_fn
  • type_idExperimental
    获取一个标识符,该标识符对于指定的类型是全局唯一的。 无论调用哪个 crate,此函数都将为类型返回相同的值。
  • type_nameExperimental
    获取包含类型名称的静态字符串切片。
  • src 指针执行易失性加载不需要将指针对齐。
  • dst 指针执行易失性存储。 指针不需要对齐。
  • unchecked_addExperimental
    返回未经检查的加法运算的结果,导致 x + y > T::MAXx + y < T::MIN 出现不确定的行为。
  • unchecked_divExperimental
    执行未经检查的除法,从而导致 y == 0x == T::MIN && y == -1 出现不确定的行为
  • unchecked_mulExperimental
    返回未经检查的乘法的结果,当 x *y > T::MAXx* y < T::MIN 时导致未定义的行为。
  • unchecked_remExperimental
    返回未经检查的除法的其余部分,从而在 y == 0x == T::MIN && y == -1 时导致未定义的行为
  • unchecked_shlExperimental
    执行未经检查的左移,导致 y < 0y >= N 出现不确定的行为,其中 N 是 T 的宽度 (以位为单位)。
  • unchecked_shrExperimental
    执行未经检查的右移,导致 y < 0y >= N 出现不确定的行为,其中 N 是 T 的宽度 (以位为单位)。
  • unchecked_subExperimental
    返回未经检查的减法的结果,当 x - y > T::MAXx - y < T::MIN 时导致未定义的行为。
  • unlikelyExperimental
    提示编译器分支条件可能为 false。 返回传递给它的值。
  • unreachableExperimental
    通知优化器代码中的这一点不可访问,从而可以进行进一步的优化。
  • variant_countExperimental
    返回 T 类型强制转换为 usize 的变体的数量; 如果 T 没有变体,则返回 0。无人居住的变体将被计算在内。
  • volatile_copy_memoryExperimental
    相当于适当的 llvm.memmove.p0i8.0i8.* 内部函数,大小为 count * size_of::<T>(),对齐方式为 min_align_of::<T>()
  • 相当于适当的 llvm.memcpy.p0i8.0i8.* 内部函数,大小为 count * size_of::<T>(),对齐方式为 min_align_of::<T>()
  • volatile_loadExperimental
    src 指针执行易失性加载。
  • volatile_set_memoryExperimental
    等效于适当的 llvm.memset.p0i8.* 内部函数,其大小为 count* size_of::<T>(),并且对齐方式为 min_align_of::<T>()
  • volatile_storeExperimental
    dst 指针执行易失性存储。
  • vtable_alignExperimental
    ptr 必须指向 vtable。 内部函数将返回存储在 vtable 中的对齐方式。
  • vtable_sizeExperimental
    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_moveExperimental
    这是 crate::ptr::write 的实现细节,不应在其他任何地方使用。请参见其评论以了解其存在的原因。
  • copy
    count * size_of::<T>() 字节从 src 复制到 dst。源和目标可能会重叠。
  • count * size_of::<T>() 字节从 src 复制到 dst。源和目标必须不重叠。
  • drop_in_placeDeprecated
  • 将一种类型的值的位重新解释为另一种类型。
  • 将从 dst 开始的 count * size_of::<T>() 内存字节设置为 val