Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чем отличаются CopyMemory и MoveMemory в Delphi? [D7, WinXP]


Страницы:   1 2

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]

Как ты сам понимаешь, вторая функция удаляет старое содержимое памяти


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо