Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
ВнизЧем отличаются CopyMemory и MoveMemory в Delphi? Найти похожие ветки
← →
DVM © (2006-12-28 12:11) [0]Зачем создали две одинаковые функции?
← →
Игорь Шевченко © (2006-12-28 12:16) [1]Как ты сам понимаешь, вторая функция удаляет старое содержимое памяти
← →
DVM © (2006-12-28 12:45) [2]
> Игорь Шевченко © (28.12.06 12:16) [1]
Вот их исходный код из модуля Windows:
procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;
Где разница?
← →
Игорь Шевченко © (2006-12-28 13:00) [3]DVM © (28.12.06 12:45) [2]
> Где разница?
Ну как же - процедура Move смотрит, откуда ее вызывают, в зависимости от этого выполняет разные действия.
← →
Anatoly Podgoretsky © (2006-12-28 13:07) [4]> DVM (28.12.2006 12:11:00) [0]
А справку прочитать не судьба.
← →
MBo © (2006-12-28 13:08) [5]Два названия - поскольку пара таких функции в platform SDK есть (одна из них не работает с перекрывающимися областями).
← →
DVM © (2006-12-28 13:24) [6]
> Anatoly Podgoretsky © (28.12.06 13:07) [4]
Вы ее сами то читали?
В Delphi справка описывает не совсем эти функции, а одноименные из platform SDK.
> Игорь Шевченко © (28.12.06 13:00) [3]
Вот код Move()
procedure Move( const Source; var Dest; count : Integer );
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;
где она смотрит?
> MBo © (28.12.06 13:08) [5]
Получается одна из функций из Delphi не соответствует своему названию.
← →
Anatoly Podgoretsky © (2006-12-28 13:28) [7]> DVM (28.12.2006 13:24:06) [6]
> где она смотрит?
А ты внимательно посмотри.
← →
DrPass © (2006-12-28 13:33) [8]
> DVM © (28.12.06 13:24) [6]
В Delphi VCL/RTL вообще нет этих функций. Там есть одна функция - Move. А CopyMemory и MoveMemory есть в Windows API. Другое дело, что разработчики Delphi посчитали свою реализацию Move более эффективной, чем микрософтовские функции, и заменили их на ее вызов. Естественно, просто убрать обе функции нельзя - иначе потеряется совместимость со старыми приложениями.
← →
DVM © (2006-12-28 13:40) [9]
> А CopyMemory и MoveMemory есть в Windows API
Их нет в API вроде. Они есть в языке си.
← →
Sha © (2006-12-28 13:44) [10]> Anatoly Podgoretsky © (28.12.06 13:28) [7]
О, может эта, как уж ее, Compiler magic ?
Я знал, я знал! :))
← →
DrPass © (2006-12-28 13:52) [11]
> DVM © (28.12.06 13:40) [9]
> Их нет в API вроде
Есть. Это WinAPI-функции, описаны в winbase.h. Если ты посмотришь этот файл, то увидишь, что они сводятся к вызовам RtlCopyMemory и RtlMoveMemory из ntdll
← →
clickmaker © (2006-12-28 13:53) [12]
> [9] DVM © (28.12.06 13:40)
>
> > А CopyMemory и MoveMemory есть в Windows API
>
> Их нет в API вроде. Они есть в языке си
winnt.h
#if defined(_M_AMD64)
NTSYSAPI
VOID
NTAPI
RtlCopyMemory (
VOID UNALIGNED *Destination,
CONST VOID UNALIGNED *Source,
SIZE_T Length
);
...
#else
#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
#endif
RtlXXXMemory живут в ntdll.dll
← →
DVM © (2006-12-28 13:57) [13]
> DrPass © (28.12.06 13:52) [11]
> clickmaker © (28.12.06 13:53) [12]
ясно.
← →
Игорь Шевченко © (2006-12-28 14:10) [14]memmove от memcpy отличаются тем, что первая гарантировано переносит область памяти на по указанному адресу без изменений.
← →
Sha © (2006-12-28 14:16) [15]> Игорь Шевченко © (28.12.06 14:10) [14]
> memmove от memcpy...
Ну вы, блин, даете )) а от сабжевых CopyMemory и MoveMemory ?
← →
DrPass © (2006-12-28 16:25) [16]
> Sha © (28.12.06 14:16) [15]
А от сабжевых тоже ничем не отличаются, если это Win9x/Win32s :)
← →
Sha © (2006-12-28 16:34) [17]> DrPass © (28.12.06 16:25) [16]
> А от сабжевых тоже ничем не отличаются
Не может быть, я в шоке :)
Эти две между собой отличаются,
но не отличаются от тех двух,
которые между собой не сильно) отличаются...
Как дальше жить, кому верить?
← →
DVM © (2006-12-28 16:34) [18]
> А от сабжевых тоже ничем не отличаются, если это Win9x/Win32s
По работе может и не отличаются, но я не про них спрашивал.
← →
Джо-со-смарта (2006-12-28 16:35) [19]Действительно, как страшно жить! :-)
← →
DrPass © (2006-12-28 16:47) [20]
> Sha © (28.12.06 16:34) [17]
Все нормально, это обычная философская дилемма
← →
Игорь Шевченко © (2006-12-28 16:57) [21]Sha © (28.12.06 14:16) [15]
А про сабжевые я в [1] сказал.
← →
Sha © (2006-12-28 17:05) [22]> Игорь Шевченко © (28.12.06 16:57) [21]
Остались невыясненными отличия сабжевых от несабжевых.
← →
Vovan #2 (2006-12-28 17:16) [23]Кто-нибудь, скажите, какой правильный ответ на вопрос [0] и почему?
← →
Sha © (2006-12-28 17:36) [24]> Vovan #2 (28.12.06 17:16) [23]
Ну так в [6] паскальная реализация дана, дальше включай мозги :)
Правда, на самом деле работает ассемблерная процедура (см. System.pas),
осторожно предположу, что делает она нечто похожее :)
← →
Vovan #2 (2006-12-28 17:46) [25]>Sha © (28.12.06 17:36) [24]
Так куда включать? Судя по [3] и [6] фокусов нет, CopyMemory и MoveMemory ничем не отличаются.
← →
Sha © (2006-12-28 17:54) [26]Заметь, не я это сказал )
← →
Vovan #2 (2006-12-28 18:18) [27]Да, но всё равно ничего не понятно из ваших разговоров. На взгляд процедуры ничем не отличаются, но ведь в [7] некто стоял на своём Почему? Почему название сдвинуто от ключевого слова procedure?
← →
Sha © (2006-12-29 00:26) [28]А ты спроси некту, зачем не-помню-кто сбрил название, т.е. эта... сдвинул усы.
Похоже, что от ключевого слова procedure.
← →
Vovan #2 (2006-12-29 00:50) [29]Анатолий Подгорецкий, поясните, пожалуйста, что вы имели ввиду?
← →
DrPass © (2006-12-29 01:22) [30]Прям крик души какой-то :)
← →
TUser © (2006-12-29 06:22) [31]AFAIK.
Виндовская CopyMemory глючит с перекрывающимися диапазонами. Чтобы не возникало проблем, борландовцы не дают ламеру ее использовать. А профи сообразит как-нибудь.
← →
Sha © (2006-12-29 09:26) [32]> DrPass © (29.12.06 01:22) [30]
> Прям крик души какой-то :)
Они не услышат, потому что ща в лифте катаются.
При этом, как сообщают "малае костоправы" (© Sha), стоят спиной к двери.
← →
Sha © (2006-12-29 09:26) [33]малые костоправы
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.056 c