меня удивляет до чего программисты которые "C-программисты всегда хотят знать больше подробностей (c) RSDN" могут доходить в споре до такого бреда. неужели никто из вас ни разу не попробовал заглянуть в окно дизассемблера?
во-первых, не глядя вообще никуда в среде разработки можно сказать что ДЛЯ ПРИВЕДЁННОГО примера ВТОРОЙ вариант БЫСТРЕЕ. если же все-таки глядеть, то:
соотв. же строка "memcpy(p1, p2, 8)" только по одному вызову почти равняется приведённому коду.
во-вторых, в нормальных программах (читай "скомпилированных компилятором, настроенным нормальным программистом") выравнивание всегда кратно четырём (выравнивание QWORD хоть и предусмотрено, но реальной пользы в его использовании я не вижу). это я о фразе "выравнивание, подходящее для double" (это что за новое слово в программировании? если на то пошло, то DOUBLE'у, как и любой структуре в памяти, даже выравнивание BYTE подойдёт).
в-третьих, настолько бездарно написать код копирования памяти могли только в microsoft'e (я не имею ничего против них, но все-таки). любой студент второго/третьего курса знает об инструкции MOVSD в сочетании с REPNE/REPNZ и напишет код, который короче в несколько раз и полностью поддается оптимизации процессором, в отличие от представленного в файле 'memcpy.asm'. интересущимся советую открыть соотв. исходники модуля System.pas среды Delphi и посмотреть как НАДО писать такие процедуры (копирование памяти выполняется с 4-хбайтным выравниванием, по возможности, обращаю внимание, а не с 2-хбайтным, как у MSVC).
итог: если пользовать memcpy() то неплохо бы для начала переписать её КАК НАДО. если копировать стандартные типы WORD DWORD DOUBLE FLOAT и прочее, то не надо никакой memcpy().