Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
15-1167231770
Ega23
2006-12-27 18:02
2007.01.21
А вот про ShortCut вопрос:


15-1167390774
Empleado
2006-12-29 14:12
2007.01.21
Проводим уходящий 2006-ой?!


15-1167750310
fromthemoon
2007-01-02 18:05
2007.01.21
подобные форумы


2-1167922229
ale2
2007-01-04 17:50
2007.01.21
Как задать такую константу


2-1168071121
lo111
2007-01-06 11:12
2007.01.21
ASCII + #





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский