Re[4]: быстрое копирование памяти
От: Progger  
Дата: 21.08.05 21:14
Оценка: :)
меня удивляет до чего программисты которые "C-программисты всегда хотят знать больше подробностей (c) RSDN" могут доходить в споре до такого бреда. неужели никто из вас ни разу не попробовал заглянуть в окно дизассемблера?

во-первых, не глядя вообще никуда в среде разработки можно сказать что ДЛЯ ПРИВЕДЁННОГО примера ВТОРОЙ вариант БЫСТРЕЕ. если же все-таки глядеть, то:

mov eax,dword ptr [p1]
mov ecx,dword ptr [p2]
mov edx,dword ptr [ecx]
mov dword ptr [eax],edx
mov ecx,dword ptr [ecx+4]
mov dword ptr [eax+4],ecx

соотв. же строка "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().
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.