2016-03-11 3 views
4

Я работаю с необработанными указателями в Rust и пытаюсь скопировать область памяти из одного места в другое. Мне удалось успешно скопировать память, но только с использованием цикла 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, вам необходимо убедиться, что только один из src или dst используется (и удаляется) после копии.