Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение размера памяти выделенный под Pointer

Delphi , Синтаксис , Память и Указатели



Автор: Мироводин Дмитрий
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Функция возврящает количество байт выделенных под Pointer.
Размер округляется в большую сторону до DWORD (4 байт).

Зависимости: Windows
Автор:       Мироводин Дмитрий, mirovodin@mail.ru
Copyright:   Мироводин Дмитрий
Дата:        16 октября 2003 г.
***************************************************** }

function GetPointerSize(const P: Pointer): Integer;
begin
  if P = nil then
    Result := -1
  else
    Result := Integer(Pointer((Integer(p) - 4))^) and $7FFFFFFC - 4;
end;

Пример использования:

var
  P: pointer;
  PSize: integer;
begin
  GetMem(P, 1024); // Размер кратен 4
  PSize := GetPointerSize(P);
  ShowMessage(inttostr(PSize)); // Результат 1024 байта
  FreeMem(P);
end;

...

var
  P: pointer;
  PSize: integer;
begin
  // Размер НЕ КРАТЕН 4
  GetMem(P, 6);
  PSize := GetPointerSize(P);
  // Результат 8 байта т.к. идет округление
  ShowMessage(inttostr(PSize));
  FreeMem(P);
end;

Приведенный код-сниппет - это функция Delphi под именем GetPointerSize, которая возвращает размер памяти, выделенной для указателя. Функция принимает аргумент const P: Pointer и возвращает целочисленное значение, представляющее собой размер в байтах.

Вот шаг за шагом, как функция работает:

  1. Если входной указатель P равен nil, функция возвращает -1.
  2. В противном случае функция вычисляет размер памяти, выделенной для P. Она делает это, отняв 4 от адреса P, кастуя результат в целочисленное значение и затем используя битовые операции, чтобы получить размер в байтах.
  3. Вычисленный размер округляется до ближайшего кратного 4 (DWORD) с помощью битовой операции AND с $7FFFFFFC - 4.

Приведенные примеры демонстрируют, как использовать эту функцию:

  1. В первом примере GetMem выделяет память для P размером в 1024 байта, кратном 4. Выход GetPointerSize(P) будет равен 1024.
  2. Во втором примере GetMem выделяет память для P размером в 6 байт, не кратном 4. Выход GetPointerSize(P) будет равен 8, потому что функция округляет до ближайшего кратного 4.

Вот альтернативное решение с использованием встроенной функции Delphi SizeOf, которая возвращает размер типа в байтах:

function GetPointerSize(const P: Pointer): Integer;
begin
  Result := SizeOf(Pointer);
end;

Эта реализация проще и более эффективна, чем оригинальный код. Однако она работает только с указателями и не обеспечивает такой же уровень настройки, как оригинальная функция.

В целом, рекомендуется использовать встроенные функции Delphi, когда это возможно, потому что они часто оптимизированы для производительности и надежности.

Функция GetPointerSize получает количество байт, выделенных под указатель, и возвращает его значение в виде целого числа, округленного до DWORD (4 байта) в большую сторону.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:23:50/0.0036468505859375/0