2015-07-03 24 views
5

Trao đổi các giá trị tại hai vị trí có thể thay đổi cùng loại, mà không cần khởi tạo hoặc sao chép một trong hai giá trị đó.Công việc `std :: mem :: swap` hoạt động như thế nào?

use std::mem; 

let x = &mut 5; 
let y = &mut 42; 

mem::swap(x, y); 

assert_eq!(42, *x); 
assert_eq!(5, *y); 

(Từ offical Rust doc)

Làm thế nào hai giá trị có thể được hoán đổi mà không cần sao chép? Giá trị 42 hoạt động như thế nào từ y đến x? Điều này không thể thực hiện được.

+1

Tôi đặt cược bạn chưa bao giờ nghe nói về [lừa xor triple] (https: // en .wikipedia.org/wiki/XOR_swap_algorithm), là một câu đố phổ biến trong các cuộc phỏng vấn mã hóa. Không chắc chắn nếu thư viện chuẩn thực hiện nó theo cách này hay không .. – vincentleest

+0

Tôi nhớ lại trong những ngày lắp ráp mà thực hiện một số câu lệnh XOR có thể trao đổi dữ liệu mà không cần một không gian bộ nhớ thứ ba để sao chép vào. Tôi không chắc chắn đó là những gì "trao đổi" sử dụng tuy nhiên. có lẽ bạn có thể xem hội đồng? https://en.wikipedia.org/wiki/XOR_swap_algorithm – Sunsetquest

+0

Đã nghe nói về nó :) – Kapichu

Trả lời

6

Chức năng không thực sự tạo một bản sao nội bộ: đây là nguồn của nó được chiết xuất từ ​​các tài liệu:

pub fn swap<T>(x: &mut T, y: &mut T) { 
    unsafe { 
     // Give ourselves some scratch space to work with 
     let mut t: T = uninitialized(); 

     // Perform the swap, `&mut` pointers never alias 
     ptr::copy_nonoverlapping(&*x, &mut t, 1); 
     ptr::copy_nonoverlapping(&*y, x, 1); 
     ptr::copy_nonoverlapping(&t, y, 1); 

     // y and t now point to the same thing, 
     // but we need to completely forget `t` 
     // because it's no longer relevant. 
     forget(t); 
    } 
} 
+0

Um ... không hoàn toàn mâu thuẫn với mô tả: "không có [...] sao chép"? Hoặc họ có nghĩa là không có giá trị sẽ được nhân đôi? – Kapichu

+7

Có sự khác biệt giữa "sao chép mức độ gỉ" (giá trị trùng lặp, sẽ cần phải được miễn phí hai lần) và sao chép mức thực hiện. Trong ngữ nghĩa gỉ, không có bản sao ở đây, hai giá trị chỉ di chuyển. – bluss

+1

@Kapichu "không có bản sao" ở đây chủ yếu có nghĩa là loại bạn làm cưa trên không cần phải là 'Clone' hoặc' Copy', nó không có nghĩa là không có bộ nhớ tạm thời được sử dụng. – Levans

Các vấn đề liên quan