pointer::swap()与std::ptr::swap()的区别是什么?
Rust中pointer::swap()与std::ptr::swap()的区别及适用场景
一、pointer::swap()与std::ptr::swap()的核心差异
两者功能完全等价,底层实现也高度一致,唯一的区别体现在调用形式上:
- 调用风格不同:
pointer::swap()是*mut T类型的方法,调用时以指针实例为主体,语法为ptr_a.swap(ptr_b),更贴近面向对象的调用习惯;std::ptr::swap()是标准库提供的自由函数,调用时需传入两个指针参数,语法为std::ptr::swap(ptr_a, ptr_b),属于函数式调用风格。
- 底层关联:实际上
pointer::swap()的内部逻辑就是直接调用std::ptr::swap(self, with),所以二者在测试中表现完全一致是必然结果。
二、std::ptr::swap()的适用场景
std::mem::swap()要求传入两个合法的可变引用,而Rust的借用规则会限制可变引用的使用(比如不能同时存在指向同一内存的两个可变引用、引用必须始终有效),当你无法满足这些条件时,std::ptr::swap()就是合适的替代方案:
- 它直接操作原始指针,不受Rust借用规则的约束,适用于需要绕过借用规则的底层内存操作场景;
- 对比
slice::swap():slice::swap()只能用于交换切片中指定索引的元素,是上层封装;而std::ptr::swap()是更底层的通用操作,只要两个*mut T指针指向有效、可写的同类型内存,就能用来交换内容,但因为是unsafe操作,需要开发者自行保证内存安全(比如指针非空悬、内存可访问等)。
内容的提问来源于stack exchange,提问作者ynn
相关产品推荐
相关产品推荐

