Здравствуйте, решил перенести свой код с Delphi на Lazarus (FPC)
интересуют альтернативы функциям WinApi
MoveMemory (я так понял тут можно применить System.Move ?)
CopyMemory
ZeroMemory
Альтернативные функции WinApi в Ubuntu
Модератор: Модераторы
MoveMemory - вроде нет аналога (а что, копируете пересекающиеся диапазоны?)
CopyMemory - Move
ZeroMemory - FillChar
CopyMemory - Move
ZeroMemory - FillChar
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
Распределение памяти http://linuxland.itam.nsc.ru/gnu/glibc/glibc-3.html
Добавлено спустя 7 минут 29 секунд:
PS: Пора добавить в ссылки вот это
Библиотека языка C GNU glibc
Сандра Лузмор (Sandra Loosemore)
Ричард Сталлман (Richard M. Stallman)
Роланд Макграх (Roland MacGrath)
Андрей Орам (Andrew Oram)
ред. 0.06 24.10.1994
http://linuxland.itam.nsc.ru/gnu/glibc/glibc.html
Добавлено спустя 7 минут 29 секунд:
PS: Пора добавить в ссылки вот это
Библиотека языка C GNU glibc
Сандра Лузмор (Sandra Loosemore)
Ричард Сталлман (Richard M. Stallman)
Роланд Макграх (Roland MacGrath)
Андрей Орам (Andrew Oram)
ред. 0.06 24.10.1994
http://linuxland.itam.nsc.ru/gnu/glibc/glibc.html
Вот только не надо этого. Без необходимости не нужно использовать сторонние функции управления памятью.
coyot.rush писал(а):Пора добавить в ссылки вот это
"чукча не читатель, чукча писатель", пожалуйста, не надо меня посылать в... библиотеку)
написал свое на "хлопський розум", для меньшего заморачивания сделал movememory такой же как и copymemory, вроде работает, главное что бы также как в WinAPI, если не затруднит - прокоментируйте)
Код: Выделить всё
...
Int8S = Shortint;
IntU = Cardinal;
...
procedure MoveMemory(Dest, Src: Pointer; Len: PtrUInt);
var D, S: PtrUInt;
E1, E2, C: PtrUInt;
Inc: Int8S;
begin
if (PtrUInt(Dest) <> PtrUInt(Src)) and (Len > 0)
then
begin
E1 := (Len) div (SizeOf(IntU)); // Будем копировать по несколько байт
// но так можно будет сделать только E1 раз,
E2 := (Len) mod (SizeOf(IntU));// остальное придется копировать
// по-байтно E2 раз
// Далее реализуем схему копирования которая исправно работает
// даже с перекрывающимися областями
if PtrUInt(Dest) > PtrUInt(Src)
then
begin
Inc := -1; // Инкремент - направление выборки байт
S := PtrUInt(Src) + Len; // Начальный адрес в источнике
D := PtrUInt(Dest) + Len; // Начальный адрес в приемнике
end
else
begin
Inc := 1; // Инкремент - направление выборки байт
S := PtrUInt(Src); // Начальный адрес в источнике
D := PtrUInt(Dest); // Начальный адрес в приемнике
end;
C := 0; // Счетчик
while C < E1 do // Копирование по несколько байт
begin
if Inc = -1
then
begin
D := D - SizeOf(IntU);
S := S - SizeOf(IntU);
IntU(Pointer(D)^) := IntU(Pointer(S)^);
end
else
begin
IntU(Pointer(D)^) := IntU(Pointer(S)^);
D := D + SizeOf(IntU);
S := S + SizeOf(IntU);
end;
C := C + 1;
end;
C := 0; // Счетчик
while C < E2 do // Копирование по-байтно
begin
if Inc = -1
then
begin
D := D - SizeOf(Int8U);
S := S - SizeOf(Int8U);
Int8U(Pointer(D)^) := Int8U(Pointer(S)^);
end
else
begin
Int8U(Pointer(D)^) := Int8U(Pointer(S)^);
D := D + SizeOf(Int8U);
S := S + SizeOf(Int8U);
end;
C := C + 1;
end;
end;
end;да уж... что тут комментировать... форматирование не правильное, отступы расставлены не так.
алсо
вот у вас функция принимает Dest, Src и Len. если вы в процессе её работы не меняете их, то для достижение ускорения сделайте их const, ведь для const-параметров компилятор выполняет особую оптимизацию
алсо
