Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Чем отличаются 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.03 c
2-1167517472
rolex
2006-12-31 01:24
2007.01.21
База данных на любом пк


3-1162412746
Gunek
2006-11-01 23:25
2007.01.21
Как выполнить запрос на выборку данных из нескольких таблиц?


2-1166953260
FBI Agent
2006-12-24 12:41
2007.01.21
Шифрование текста в ini-файле


2-1167218022
term1t
2006-12-27 14:13
2007.01.21
ADO + MS VFP


15-1167812243
Footballer
2007-01-03 11:17
2007.01.21
Intenet Explorer 7.0