Results 1 to 8 of 8

Thread: Getmem/FreeMem - hoe werkt het ook al weer.

  1. #1

    Getmem/FreeMem - hoe werkt het ook al weer.

    Ik wil een query cache (linked list) maken:
    Code:
    TYJSONString = AnsiString;
    
    TYQueryResult = class
      private
        FLastAccess: TDateTime;
        FKey: AnsiString;
        FPrior: TYQueryResult;
        FNext: TYQueryResult;
        FJSONResult: TYJSONString;
      public
        destructor Destroy; override;
        property LastAccess: TDateTime read FLastAccess write FLastAccess;
        property Key: Ansistring read FKey write FKey;
        property Prior: TYQueryResult read FPrior write FPrior;
        property Next: TYQueryResult read FNext write FNext;
        property JSONResult: TYJSONString read FJSONResult write FJSONResult;
      end; {TYQueryResult}
    De lengte van Key en JSONResult zijn variabel. Kennelijk liggen de tijden van New/GetMem/Dispose/FreeMem inmiddels te ver weg.
    Hoe werkte het ook al weer?
    Code:
    NewResult: TYQueryResult;
    .
    .
    GetMem(NewResult, sizeof(NewResult));
    .
    Ik zit in dubio hoe de variabele lengte van Key en JSONResult meegenomen moet worden, of is dat al geregeld?

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Naar mijn weten is dat al geregeld in TYQueryResult. Die handelt voor jouw het geheugenprobleem.
    Delphi is great. Lazarus is more powerfull

  3. #3
    Je zegt eigenlijk: alleen de pointers size wordt meegenomen. Als die pointers opgeruimd worden dan wordt ook de rest van het geheugen van de reference counted strings opgeruimd? Ik zou dus ook New/Dispose kunnen gebruiken?

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Classes (itt objecten) zijn geinitializeerd. IOW, tijdens instantatie (.newinstance, onderdeel van de constructor sequence) wordt de gealloceerde ruimte geNILLed(*). Dit initializeert zowel geautomatiseerde types als de rest op 0. (**)

    Aan het eind (tijdens de destructor fase) wordt de instantie ruimte gefinalizeerd. Dat wil zeggen, dat op ieder geautomatiseerd type in de instantie (ansistring,widestring,unicodestring,dynamische arrays, interfaces en variants) een functie wordt aangeroepen die de referenties verlaagd, en vrijgeeft indien geen andere referenties meer bestaan. (***)

    Met new en dispose kan je met classes en geautomatizeerde types eigenlijk niets. Hou een goed verschil aan tussen pointers, en dingen die _intern_ pointers zijn. new en dispose werken op pointers en (TP) objecten. Niet op classes en geautomatiseerde types.

    Dit is overigens allemaal gelijk in FPC en Delphi. Met als enige uitzondering de mate van initializatie van TP objecten, dat weet ik even niet zeker, maar dat is niet relevant voor de vraag.

    (*) Dit is een aardige performance sink overigens. In b.v. profiler overzichten de FPC compiler is dit nillen een van de top 5 CPU vreters. Ook in grote object frameworks is dit merkbaar.

    (**) het wordt niet als netjes beschouwd hier gebruik van te maken voor niet geautomatiseerde types.

    (***) Dynamische arrays zijn vziw niet copy on write, deze worden daardoor altijd vrijgegeven, want er kunnen geen andere referenties bestaan. Ze bestaan zolang als hun scope (beetje RAII achtig)

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Kort samengevat:

    - de key hoef je niet vrij te geven.
    - Of je Het fjsonresult vrij moet geven hangt af van wat het type precies is. Als het een alias van een van de automatische types is, dan niet, anders wel.

  6. #6
    Staat bovenaan: TYJSONString = AnsiString;

    Ik ben aan een hele lange vakantie toe. Ik dacht dat ik TYQueryResult als record had gedeclareerd, maar het is dus 'n class. Toen ik mijn rommel hier deponeerde zag ik dat over het hoofd. Excuses.

    Ik ga dus de gewone class constructors en destructors gebruiken. Of toch records? Is dit toch efficiënter? Er zit een synchronisatie lock op het invoegen, dus het moet wel zo snel mogelijk gaan.

  7. #7
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Records worden gekopieerd en classes worden geïnitialiseerd, behalve de variabeles.
    Delphi is great. Lazarus is more powerfull

  8. #8
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Optimaal record gebruik kan sneller zijn dan classes. Maar dat merk je de eerste 1.5 miljoen objecten niet.

    Records zijn overigens ook geinitializeerd/finalizeerd onder delphi. Maar goed ook, anders zou je geen ansistrings in records kunnen stoppen

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •