Function core::ptr::swap 1.0.0[−][src]
pub unsafe fn swap<T>(x: *mut T, y: *mut T)
Expand description
在相同类型的两个可变位置交换值,而无需取消初始化任何一个。
但是对于以下两个例外,此函数在语义上等效于 mem::swap
:
-
它对裸指针而不是引用进行操作。 如果引用可用,则应首选
mem::swap
。 -
两个指向的值可能会重叠。 如果值确实重叠,则将使用
x
的内存重叠区域。 在下面的第二个示例中对此进行了演示。
Safety
如果违反以下任一条件,则行为是未定义的:
-
对于读取和写入,
x
和y
都必须为 有效 的。 -
x
和y
必须正确对齐。
请注意,即使 T
的大小为 0
,指针也必须非空且正确对齐。
Examples
交换两个不重叠的区域:
use std::ptr; let mut array = [0, 1, 2, 3]; let x = array[0..].as_mut_ptr() as *mut [u32; 2]; // 这是 `array[0..2]` let y = array[2..].as_mut_ptr() as *mut [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