2009-07-17 4 views
8

Ma compréhension est que le mot-clé static a été introduit pour la compatibilité avec .NET (avec strict)Est-ce que le mot-clé static de Delphi a un point quelconque dans le code natif?

class TExample 
    class procedure First; 
    class procedure Second; static; 

Les différences entre les procédures First et Second sont: -

  1. First peut être redéfinies dans une classe descendante
  2. First passe un paramètre auto implicite référençant la classe TExample.

La procédure de classe Second ne peut pas être remplacée et ne transmet aucun paramètre. Elle est donc compatible .NET. Donc, est-il utile d'utiliser le mot clé static dans un code natif maintenant qu'il existe une divergence entre la syntaxe Delphi & Prism?

Répondre

20

Static class methods have no hidden class reference argument. Pour cette raison, ils sont compatibles avec les anciens pointeurs de fonctions, et peuvent donc être utilisés pour interagir avec l'API Windows et d'autres API C. Exemple:

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; // doesn't work 
    WP := StaticWndProc; // works 
    // ... 
    TWndProc (WindowClass.lpfnWndProc) := WP; 
    Windows.RegisterClass (WindowClass); 
end; 

(. Bien sûr, vous auriez pu utiliser une fonction globale à la place, mais autres que les fonctions globales, les fonctions statiques de classe ont une association claire avec une classe)

3

statique, c'est un peu plus rapide. Il y a un add esp, -8 dans la méthode First qui n'est pas là dans Second.

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; 
end; 

class procedure TExample.Second; 
var 
    I : Integer; 
begin 
    i:=44510; 
end; 

begin 
    { TODO -oUser -cConsole Main : Hier Code einfügen } 
    TExample.First; 
    TExample.Second; 
end. 

Première:

staticTest.dpr.20: begin 
00408474 55    push ebp 
00408475 8BEC    mov ebp,esp 
00408477 83C4F8   add esp,-$08 ;This is the line I mentioned 
0040847A 8945FC   mov [ebp-$04],eax 
staticTest.dpr.21: i:=61374; 
0040847D C745F8BEEF0000 mov [ebp-$08],$0000efbe 
staticTest.dpr.22: end; 
00408484 59    pop ecx 
00408485 59    pop ecx 
00408486 5D    pop ebp 
00408487 C3    ret 

Deuxième:

staticTest.dpr.27: begin 
00408488 55    push ebp 
00408489 8BEC    mov ebp,esp 
0040848B 51    push ecx 
staticTest.dpr.28: i:=44510; 
0040848C C745FCDEAD0000 mov [ebp-$04],$0000adde 
staticTest.dpr.29: end; 
00408493 59    pop ecx 
00408494 5D    pop ebp 
00408495 C3    ret 
00408496 8BC0    mov eax,eax 

En bref - Je ne vois aucune raison.

+0

La chose est que le premier sauve eax. Probablement un prologue codé en dur dans le compilateur. IOW le premier a apparemment un paramètre et le second pas. Il pourrait réduire à la même chose avec l'optimisation sur si. –

Questions connexes