Module std::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_offset⚠Experimental
    计算与指针的偏移量 (可能会自动换行)。
  • assert_inhabitedExperimental
    如果 T 未定义,则无法执行的不安全函数的守卫: 这将静态地为 panic,或者什么也不做。
  • 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
    对当前值按位与,返回前一个值。
  • 如果当前值与 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_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_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 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • prefetch_write_data⚠Experimental
    prefetch 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • prefetch 内部函数是对代码生成器的提示,如果支持的话,它会插入一个预取指令。否则,它是无操作的。 预取对程序的行为没有影响,但可以更改其性能特征。
  • ptr_guaranteed_cmpExperimental
    有关详细信息,请参见 <*const T>::guaranteed_eq 的文档。 如果结果未知,则返回 2。 如果保证指针相等,则返回 1 如果保证指针不相等,则返回 0
  • ptr_maskExperimental
    根据掩码屏蔽指针的位。
  • ptr_offset_from⚠Experimental
    有关详细信息,请参见 <*const T>::offset_from 的文档。
  • 有关详细信息,请参见 <*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⚠Experimental
    Rust 的 “try catch” 构造使用数据指针 data 调用函数指针 try_fn。
  • type_idExperimental
    获取一个标识符,该标识符对于指定的类型是全局唯一的。 无论调用哪个 crate,此函数都将为类型返回相同的值。
  • type_nameExperimental
    获取包含类型名称的静态字符串切片。
  • 从 src 指针执行易失性加载不需要将指针对齐。
  • 对 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>()
  • 相当于适当的 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。