Microsoft предоставляет альтернативы для memcpy и wmemcpy, которые проверяют их параметры.
memcpy_s говорит: «Хм, прежде чем я прочитаю с этого адреса, позвольте мне убедиться, что это не нулевой указатель; и прежде чем писать по этому адресу, я снова выполню этот тест. Я также сравню число из байтов, которые мне было предложено скопировать в заявленный размер места назначения; если и только если вызов пройдет все эти тесты, я выполню копию. "
memcpy говорит: «Запишите получателя в регистр, запишите источник в регистр, запишите счет в регистр, выполните MOVSB или MOVSW». (Пример для геогородов, недолгих для этого мира: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)
Edit: для примера в дикой природе Ваш запрос - моя команда подход к memcpy, рассмотрим OpenSolaris, где memcpy (для некоторых конфигураций) , определенный в терминах bcopy и bcopy (для некоторых конфигураций) равно ...
void
33 bcopy(from, to, count)
34 #ifdef vax
35 unsigned char *from, *to;
36 int count;
37 {
38
39 asm(" movc3 12(ap),*4(ap),*8(ap)");
40 }
41 #else
42 #ifdef u3b /* movblkb only works with register args */
43 unsigned char *from, *to;
44 int count;
45 {
46 asm(" movblkb %r6, %r8, %r7");
47 }
48 #else
49 unsigned char *from, *to;
50 int count;
51 {
52 while ((count--) > 0)
53 *to++ = *from++;
54 }
55 #endif
Редактировать: Спасибо, Милли Смит! Вот то, что было на странице геокоссий, на которую я ссылался выше:
MOVS
Инструкция movs используется для копирования исходной строки в место назначения (да, копировать, а не перемещать). Эта инструкция имеет два варианта: movsb и movsw. Movsb («Move string byte») перемещает один байт за раз, тогда как movsw перемещает два байта за один раз.
Поскольку мы хотим перемещать несколько байтов за раз, эти инструкции movs выполняются пакетами с использованием префикса rep. Количество движений определяется регистром CX. Смотрите пример ниже:
:
lds si, [src]
les di, [dest]
cld
mov cx, 100
rep movsb
:
Этот пример скопирует 100 байтов из src в dest. Если вы замените movsb на movsw, вы скопируете 200 байтов. Если вы удалите префикс rep, регистр CX не будет иметь никакого эффекта. Вы будете перемещать один байт (если это movsb, или 2 байта, если это movsw).