pub unsafe fn swap<T>(x: *mut T, y: *mut T)
Expand description
在相同类型的两个可变位置交换值,而无需取消初始化任何一个。
但对于以下例外,这个函数在语义上等价于 mem::swap
:
-
它对裸指针而不是引用进行操作。 如果引用可用,则应首选
mem::swap
。 -
两个指向的值可能会重叠。 如果值确实重叠,则将使用
x
的内存重叠区域。 在下面的第二个示例中对此进行了演示。 -
该操作是 “untyped”,因为数据可能未初始化或违反
T
的要求。
初始化状态被完全保留。
Safety
如果违反以下任一条件,则行为是未定义的:
-
对于读取和写入,
x
和y
都必须为 有效 的。 -
x
和y
必须正确对齐。
请注意,即使 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