2016-03-11 28 views
4

我正在使用Rust中的raw指針,並且試圖將內存區域從一個地方複製到另一個地方。我已經成功地複製了內存,但只使用了for循環,並使用指針的偏移量單獨複製每個字節。我不知道如何更有效地做到這一點,即作爲一個字節字符串的單個副本,任何人都可以指向正確的方向嗎?在Rust中高效地寫入多個字節

fn copy_block_memory<T>(src: *const T, dst: *mut u8) { 
    let src = src as *const u8; 
    let size = mem::size_of::<T>(); 
    unsafe { 
     let bytes = slice::from_raw_parts(src, size); 
     for i in 0..size as isize { 
      ptr::write(dst.offset(i), bytes[i as usize]); 
     } 
    } 
} 
+1

LLVM(rustc的後端)肯定會檢測到這樣的循環並將其優化爲儘可能最快的代碼。 – rightfold

+9

你可以使用[std :: ptr :: copy](https://doc.rust-lang.org/std/ptr/fn.copy.html)或[std :: ptr :: copy_nonoverlapping](https:/ /doc.rust-lang.org/std/ptr/fn.copy_nonoverlapping.html)(後者可能,因爲你的記憶位置可能不重疊(你需要保證這一點)) –

+4

@ker你應該把它變成一個回答。 – starblue

回答

6

正如在評論中提到@ker,這實際上是建立在標準庫:

請注意,儘管Rust在移動物體的方式(從而轉移所有權)只是複製位,除非對象是Copy,則需要確保在複製後僅使用了srcdst中的一個。