Хай, Progger, Вижу, ты тут наколбасил:
Этот (правильный) код мы запомним, коментарий ниже:
P>mov eax,dword ptr [p1]
P>mov ecx,dword ptr [p2]
P>mov edx,dword ptr [ecx]
P>mov dword ptr [eax],edx
P>mov ecx,dword ptr [ecx+4]
P>mov dword ptr [eax+4],ecx
P>соотв. же строка "memcpy(p1, p2, 8)" только по одному вызову почти равняется приведённому коду.
P>во-вторых, в нормальных программах (читай "скомпилированных компилятором, настроенным нормальным программистом") выравнивание всегда кратно четырём (выравнивание QWORD хоть и предусмотрено, но реальной пользы в его использовании я не вижу). это я о фразе "выравнивание, подходящее для double" (это что за новое слово в программировании? если на то пошло, то DOUBLE'у, как и любой структуре в памяти, даже выравнивание BYTE подойдёт).
Весьма опрометчивое заявление. Ты хоть подозреваешь о существовании других процессорных архитектур, или для тебя свет клином сошелся на x86? Да и x86 начиная с 486 умеет прерываться по обращению к невыровненной панмяти, если установлен соответсвующий флаг. Кто гарантирует тебе, что в конкретном случае это будет не так?
P>в-третьих, настолько бездарно написать код копирования памяти могли только в microsoft'e (я не имею ничего против них, но все-таки). любой студент второго/третьего курса знает об инструкции MOVSD в сочетании с REPNE/REPNZ и напишет код, который короче в несколько раз и полностью поддается оптимизации процессором, в отличие от представленного в файле 'memcpy.asm'. интересущимся советую открыть соотв. исходники модуля System.pas среды Delphi и посмотреть как НАДО писать такие процедуры (копирование памяти выполняется с 4-хбайтным выравниванием, по возможности, обращаю внимание, а не с 2-хбайтным, как у MSVC).
Нет, ну какой-то за.....ц наехал на мою любимую компанию. Этого я так не оставлю. Да ладно бы еще по делу — это можно было бы и стерпеть, а тут — ну совершенно без повода. Короче, слушай сюда, коль сам напросился на порку: то, что ты предлагаешь — даже не вчерашний и не позавчерашний день, а просто доисторическая эра. Ты застрял на уровне Intel 8088. Для них ТАК действительно было оптимально. Короче, БЕГОМ В БИБЛИОТЕКУ. Начни со статьи "Опмизация программ на ассемблере для i486 и Pentium" (потом ты поймешь, что для последующих процессоров, начиная с пня-про, ситуация еще более актуальна).
Ладно, специально для тебя цитирую:
3.6. Какие команды использовать ?
1) Уже на i486 оптимизировались лишь так называемые часто используе-
мые команды: mov, add, sub, neg, inc, dec, xor, or, and, not, cmp,
test, команды сдвига и ветвления. Поэтому оказывается лучше использо-
вать вместо "тяжеловесных" команд последовательности простых.
Hа Р5 только простые команды являются спариваемыми (см. приложение).
Пример:
U V
rep movsd — ; 4 такта
--------------
1 байт за такт
но
U V
mloop:
mov eax,[esi] mov ebx,[esi+4] ; 1
mov ecx,[esi+8] mov edx,[esi+12] ; 2
mov [edi],eax mov [edi+4],ebx ; 3
mov [edi+8],ecx mov [edi+12],edx ; 4
add esi,16 add edi,16 ; 5
dec ebp jnz mloop ; 6
------------------
2.67 байта за такт
Разворачивая цикл дальше, в пределе получаем 4 байта за такт.
Теперь ты понял, почему мелкомягкие сделали именно так? Так кто из вас двоих (ты или M$) идиот?
Далее лезешь на сайт Интел и скачиваешь доки по их процессорному ряду x86. Самый важный документ для тебя — Intel Architecture Optimization Manual. Скачиваешь его (для каждой модели процессора он свой) и читаешь медленно и вдумчиво до просветления. Особое внимание обращаешь на различные stall'ы.
P>итог: если пользовать memcpy() то неплохо бы для начала переписать её КАК НАДО. если копировать стандартные типы WORD DWORD DOUBLE FLOAT и прочее, то не надо никакой memcpy().
Да, а тебе НЕПЛОХО БЫ прежде чем высказывать суждения по какому-либо поводу, получить хотя бы поверхностное представление об обсуждаемых вещах. Короче: СУДИ, ДРУЖОК, НЕ ВЫШЕ САПОГА.
PS. А что, дельфятник действительно выдает "REPNZ MOVSD" при включенной оптимизации по быстродействию? Если ответ "ДА", выкинь его на помойку и перейди на что-нибудь более современное/эффективное.