Function std::ptr::swap

1.0.0 (const: unstable) · source ·
pub unsafe fn swap<T>(x: *mut T, y: *mut T)
Expand description

在相同类型的两个可变位置交换值,而无需取消初始化任何一个。

但对于以下例外,这个函数在语义上等价于 mem::swap:

  • 它对裸指针而不是引用进行操作。 如果引用可用,则应首选 mem::swap

  • 两个指向的值可能会重叠。 如果值确实重叠,则将使用 x 的内存重叠区域。 在下面的第二个示例中对此进行了演示。

  • 该操作是 “untyped”,因为数据可能未初始化或违反 T 的要求。

初始化状态被完全保留。

Safety

如果违反以下任一条件,则行为是未定义的:

  • 对于读取和写入,xy 都必须为 有效 的。

  • xy 必须正确对齐。

请注意,即使 T 的大小为 0,指针也必须非空且正确对齐。

Examples

交换两个不重叠的区域:

use std::ptr;

let mut array = [0, 1, 2, 3];

let (x, y) = array.split_at_mut(2);
let x = x.as_mut_ptr().cast::<[u32; 2]>(); // 这是 `array[0..2]`
let y = y.as_mut_ptr().cast::<[u32; 2]>(); // 这是 `array[2..4]`

unsafe {
    ptr::swap(x, y);
    assert_eq!([2, 3, 0, 1], array);
}
Run

交换两个重叠的区域:

use std::ptr;

let mut array: [i32; 4] = [0, 1, 2, 3];

let array_ptr: *mut i32 = array.as_mut_ptr();

let x = array_ptr as *mut [i32; 3]; // 这是 `array[0..3]`
let y = unsafe { array_ptr.add(1) } as *mut [i32; 3]; // 这是 `array[1..4]`

unsafe {
    ptr::swap(x, y);
    // 切片的索引 `1..3` 在 `x` 和 `y` 之间重叠。
    // 合理的结果将是 `[2, 3]`,因此索引 `0..3` 为 `[1, 2, 3]` (与 `swap` 匹配的 `y`) ; 或将它们设为 `[0, 1]`,以使索引 `1..4` 为 `[0, 1, 2]` (与 `swap` 之前的 `x` 匹配)。
    // 定义此实现是为了做出后一种选择。
    assert_eq!([1, 0, 1, 2], array);
}
Run