![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чем отличаются CopyMemory и MoveMemory в Delphi? [D7, WinXP]
DVM © (2006-12-28 12:11:00)Зачем создали две одинаковые функции?
DVM (2006-12-28 13:57:00) [21]
> DrPass © (28.12.06 13:52) [11]
> clickmaker © (28.12.06 13:53) [12]
ясно.
clickmaker (2006-12-28 13:53:00) [22]
> [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
DrPass (2006-12-28 13:52:00) [23]
> DVM © (28.12.06 13:40) [9]
> Их нет в API вроде
Есть. Это WinAPI-функции, описаны в winbase.h. Если ты посмотришь этот файл, то увидишь, что они сводятся к вызовам RtlCopyMemory и RtlMoveMemory из ntdll
Sha (2006-12-28 13:44:00) [24]> Anatoly Podgoretsky © (28.12.06 13:28) [7]
О, может эта, как уж ее, Compiler magic ?
Я знал, я знал! :))
DVM (2006-12-28 13:40:00) [25]
> А CopyMemory и MoveMemory есть в Windows API
Их нет в API вроде. Они есть в языке си.
DrPass (2006-12-28 13:33:00) [26]
> DVM © (28.12.06 13:24) [6]
В Delphi VCL/RTL вообще нет этих функций. Там есть одна функция - Move. А CopyMemory и MoveMemory есть в Windows API. Другое дело, что разработчики Delphi посчитали свою реализацию Move более эффективной, чем микрософтовские функции, и заменили их на ее вызов. Естественно, просто убрать обе функции нельзя - иначе потеряется совместимость со старыми приложениями.
Anatoly Podgoretsky (2006-12-28 13:28:00) [27]> DVM (28.12.2006 13:24:06) [6]
> где она смотрит?
А ты внимательно посмотри.
DVM (2006-12-28 13:24:00) [28]
> 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 не соответствует своему названию.
MBo (2006-12-28 13:08:00) [29]Два названия - поскольку пара таких функции в platform SDK есть (одна из них не работает с перекрывающимися областями).
Anatoly Podgoretsky (2006-12-28 13:07:00) [30]> DVM (28.12.2006 12:11:00) [0]
А справку прочитать не судьба.
Игорь Шевченко (2006-12-28 13:00:00) [31]DVM © (28.12.06 12:45) [2]
> Где разница?
Ну как же - процедура Move смотрит, откуда ее вызывают, в зависимости от этого выполняет разные действия.
DVM (2006-12-28 12:45:00) [32]
> Игорь Шевченко © (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 12:16:00) [33]Как ты сам понимаешь, вторая функция удаляет старое содержимое памяти