grundsätzliches über Container



  • Hallo zusammen,

    Seit einiger Zeit bescäftigen mich zwei Fragen zu Containern,
    Hr. Prinz und Hr. Liberty liegen hier rum und wissen
    auch keine Antwort drauf, bitte erleuchtet mich:

    1. Übergabe eines Containers an eine Funktion:

    void fListParam(list<RECT> RectList)
    {
    ...
    }
    

    Wird dabei eine komplette Kopie der Liste an die Funktion übergeben oder
    wie bei ArrayNamen nur ein Zeiger auf den Kopf der Liste ? Wäre logisch,
    aber andererseits sind Container ja Objekte.
    Macht Übergabe per Referenz also Sinn bei Containern ?

    2. In welchem Speicher werden Stack-Objekte in der Liste abgelegt?

    ...
    list<RECT> RectList
    RECT rc;
    GetWindowRect(hwnd, &rc);
    RectList.push_back(rc);
    ...
    

    Macht es Sinn, rc auf dem heap anzulegen und eine Liste mit Zeigern
    zu führen, oder landet es beim Einfügen in die Liste sowieso dort ?
    Anders kann ich mir es eigentlich nicht vorstellen, aber wer weiss,...

    Danke schonmal, gute Nacht

    Biff



  • Biff Malibu schrieb:

    Wird dabei eine komplette Kopie der Liste an die Funktion übergeben oder
    wie bei ArrayNamen nur ein Zeiger auf den Kopf der Liste

    ersteres

    aber andererseits sind Container ja Objekte.
    Macht Übergabe per Referenz also Sinn bei Containern ?

    oft genug.

    2. In welchem Speicher werden Stack-Objekte in der Liste abgelegt?

    dort, wo der allokator will 😉 normalerweise verwendet der new und delete.

    Macht es Sinn, rc auf dem heap anzulegen und eine Liste mit Zeigern
    zu führen, oder landet es beim Einfügen in die Liste sowieso dort ?

    eine kopie von rc landet auf dem heap.
    wenn du zeiger verwendest, wird eben der zeiger kopiert (und natürlich nicht das, worauf er zeigt).



  • Biff Malibu schrieb:

    Wird dabei eine komplette Kopie der Liste an die Funktion übergeben oder wie bei ArrayNamen nur ein Zeiger auf den Kopf der Liste ?

    komplette kopie.

    Wäre logisch, aber andererseits sind Container ja Objekte.
    Macht Übergabe per Referenz also Sinn bei Containern ?

    ja, unbedingt. das kopieren der ganzen liste dauert ne kleine ewigkeit.

    2. In welchem Speicher werden Stack-Objekte in der Liste abgelegt?

    ...
    list<RECT> RectList
    RECT rc;
    GetWindowRect(hwnd, &rc);
    RectList.push_back(rc);
    ...
    

    stack-objekte?
    also RectList liegt auf dem stack. rc liegt auf dem stack. während push_back wird ne kopie von rc gebaut, die im freispeicher liegt.

    Macht es Sinn, rc auf dem heap anzulegen und eine Liste mit Zeigern
    zu führen, oder landet es beim Einfügen in die Liste sowieso dort ?

    rc ist ja bloß 8 (oder?) bytes groß. da ist kopieren so schnell, daß es keinen sinn macht. lass ruhig push_back innendrin kopieren. die lösung mit eigenen objekten auf dem freispeicher und ner liste, die nur zeiger verwaltet, macht man besser nicht ohne not.
    notlagen sind:
    - man verwaltet verschiedene objekte einer klassenhierarche in der liste und die sind auch verschieden groß und so. also verwaltet man einfach zeiger, die sind alle gleich groß (vereinfachte darstelung).
    - die objekte sind tierisch groß und kopieren sich echt lahm.
    - die objekte lassen sich überhaupt gar nicht kopieren.



  • Danke !

    Der Nebel hat sich wieder ein bißchen gelichtet 🙂

    BIff


Log in to reply