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

Передача параметров в Delphi: Размер имеет значение ```

Delphi , Синтаксис , Записи и Множества

В статье мы рассмотрим особенности передачи параметров в языке программирования Object Pascal, используемом во фреймворке Delphi. Основное внимание будет уделено вопросу о том, почему записи (records) передаются по значению, а не по ссылке, и как это зависит от их размера.

Передача параметров в Delphi: Размер имеет значение

В Object Pascal, когда мы определяем процедуру с параметром, который является записью (record), то он передается по значению. Это означает, что в функцию передается копия значения, а не ссылка на оригинальные данные.

Пример:

type
  TMyRec = record
    x: string;
  end;

procedure Test(const x: TMyRec);
begin
  // ...
end;

Почему же так происходит? С точки зрения эффективности, казалось бы, передача по ссылке была бы предпочтительнее, особенно для больших структур данных. Однако, в Object Pascal, если размер записи меньше определенного порога (8 байт на 32-битных системах и 16 байт на 64-битных), то она передается по значению.

Подробности:

Согласно документации Embarcadero, для маленьких структур данных (sets, records, статические массивы размером до 8 байт) передача происходит как значение определенного размера: 8-битное, 16-битное или 32-битное. Если же размер превышает этот порог, то структура передается по ссылке в виде указателя на 32 бита.

Пример с разными размерами записи:

type
  TMyRecSmall = record
    x: Array[1..4] of byte;
  end;

  TMyRecLarge = record
    x: Array[1..5] of byte; // Передается по ссылке на 32-битных системах
  end;

Начиная с версии Delphi Rio, даже небольшие записи размером в 5 байт будут передаваться по ссылке и на 64-битных системах.

Принудительная передача по ссылке:

Если необходимо явно указать передачу параметра по ссылке, можно использовать директиву const [ref]:

procedure Test(const [ref] x: TMyRec);
begin
  // ...
end;

Это изменение в поведении передачи параметров было документировано в разделе "What's New" для Delphi Rio, хотя и не очень ясно.

Заключение:

Таким образом, важно понимать, что размер записи играет ключевую роль в том, будет ли она передаваться по значению или по ссылке. Это поведение является частью соглашения о вызовах (calling convention) и может повлиять на производительность программы, особенно при работе с большими объемами данных.

Надеемся, эта статья помогла вам лучше понять, как работает передача параметров в Object Pascal и почему размер действительно имеет значение.

Создано по материалам из источника по ссылке.

В статье обсуждается особенность языка программирования Object Pascal, используемого во фреймворке Delphi, по которой записи (records) передаются в процедуры и функции по значению, а не по ссылке, что зависит от их размера.


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

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




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


:: Главная :: Записи и Множества ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 08:53:26/0.0032470226287842/0