Статическое программирование в Delphi: использование процедур классов с ключевым словом static
Вопрос о применении ключевого слова static в процедурах классов в Delphi актуален в контексте совместимости с .NET и влияния на производительность в нативном коде. В этом обзоре мы рассмотрим, почему и как следует использовать static в коде на Pascal, а также приведем примеры из практики.
Что такое static в Delphi и зачем он нужен
Ключевое слово static было введено в Delphi для обеспечения совместимости с .NET. В контексте нативного кода Delphi (не связанного с .NET) использование static может показаться излишним, однако оно имеет свои преимущества.
Основные отличия static и не-static процедур классов
Процедуры классов без static могут быть переопределены в дочерних классах и передают неявный параметр, ссылающийся на текущий экземпляр класса. В отличие от них, static процедуры не могут быть переопределены и не передают неявный параметр, что делает их совместимыми с .NET и C-стилем программирования.
Пример кода
program staticTest;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TExample = class
class procedure First;
class procedure Second; static;
end;
{ Текст класса TExample }
class procedure TExample.First;
var
i : Integer;
begin
i := 61374; // Тут есть неявное сохранение регистра EAX
end;
class procedure TExample.Second;
var
I : Integer;
begin
i := 44510; // Без сохранения регистра EAX, что может быть немного быстрее
end;
begin
TExample.First;
TExample.Second;
end.
Влияние на производительность
На уровне ассемблера процедуры без static могут содержать дополнительные инструкции, такие как add esp, -8, которые не присутствуют в static процедурах. Это может незначительно увеличить скорость выполнения static процедур за счет уменьшения количества выполняемых инструкций.
Применение static для взаимодействия с C и Windows API
Статические процедуры классов в Delphi могут быть приведены к указателям на функции, что делает их совместимыми с C-стилем и Windows API. Например, при регистрации класса окна:
type
TForm = class
private
class function NonStaticWndProc (wnd: HWND; Message: Cardinal;
wParam: WPARAM; lParam: LPARAM): LRESULT;
class function StaticWndProc (wnd: HWND; Message: Cardinal;
wParam: WPARAM; lParam: LPARAM): LRESULT; static;
procedure RegisterClass;
end;
procedure TForm.RegisterClass;
type
TWndProc = function (wnd: HWND; Message: Cardinal;
wParam: WPARAM; lParam: LPARAM): LRESULT;
var
WP: TWndProc;
WindowClass: WNDCLASS;
begin
// WP := NonStaticWndProc; // не работает
WP := StaticWndProc; // работает
// ...
TWndProc(WindowClass.lpfnWndProc) := WP;
Windows.RegisterClass(WindowClass);
end;
Выводы
Использование ключевого слова static в процедурах классов в Delphi может быть полезным для улучшения производительности, обеспечения совместимости с C и Windows API, а также для избежания нежелательного переопределения методов в дочерних классах. Хотя разница в производительности может быть незначительной, правильное использование static способствует чистоте и эффективности кода.
Ключевое слово `static` в процедурах классов в Delphi используется для обеспечения совместимости с .NET, предотвращения передачи неявного параметра экземпляра класса и может незначительно улучшить производительность за счет уменьшения
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.