Dynamisches Array auf dem Heap OHNE Konstructor/Destructor Aufruf erzeugen?



  • Hallo Forum

    Gegeben ist eine Funktion die überprüft ob sich ein Punkt Innerhalb eines Polygons befindet oder nicht.
    Dazu wird der Funktion ein Array aus Koordinaten Classen übergeben.
    Etwa so.

    bool contains(const cPoint Points[], size_t Size, const cPoint &Point);
    

    Zu meiner Frage.
    In einen Test, ob ein Punkt Innerhalb eines Objektes liegt, wird die Außenkante des Objektes in Polygonpunkte zerlegt und dann der Funktion zum Testen übergeben. Als einfache Version sieht das so aus.

    ...
    ...
    vector< cPoint > Points;
    
    // Zerlege und Speicher die Punkte
    Points.push_back(Point);
    
    ...
    contains(&Points.front(), Points.size(), TestPunkt);
    

    Das ist aber Schnecken Code. Sehr langsam. 😞

    Ich möchte also das Koordinaten Array auf den Heap erzeugen. Ich habe zwar nicht die Information wieviel Punkte das Array brauchen wird, aber ich habe die Information der Maximal Möglichen Punkt (Kein Statischer Wert). Also ran an den Speck.

    ...
    ...
    cPoint Points[ MaximalPunkte_Errechnet ];
    
    ...
    // Punkte füllen und merken wieviel ich benutzt habe
    ...
    contains(Points, GebrauchtePunkte, TestPunkt);
    ...
    

    Was mich jetzt aber noch Stört ist das beim Anlegen des Arrays n Punkte Konstruiert werden und beim Verlassen der Funktion n Punkte über den Destructor Zerstört werden.

    Nehmen wir mal an das maxmimal 100 Punkte im Array sein können, aber nur 25 gebraucht werden. So werden 75 Point Klassen unnötig angelegt und zerstört.

    Hier suche ich eine Möglichkeit wie man das Lösen könnte.
    Vielleicht hat jemand auch eine Möglichkeit wie man das in ein Objekt Verpacken kann da ich an mehreren Stellen so eine Dynamische Erzeugung von Koordinaten Arrays habe.

    Danke Lichtlein



  • Indem Du Dein cPoints-Array (oder Deinen cPoints-Vektor) irgendwo hältst und wiederverwendest. Außerdem benutzt Du in Deiner "optimierten" Version gerade nicht den Freispeicher, sondern den automatischen Speicher.



  • Mmm habe ich mir schon gedacht das ich da so eine Art "Temporäres Koordinaten Array Pool" Basteln muss. Nicht ganz so schön.

    Muss ja verhindern das sich jemand so ein Array holt und nicht mehr zurück gibt.

    Lichtlein



  • Lichtlein schrieb:

    Das ist aber Schnecken Code. Sehr langsam. 😞

    Warum ist der Code langsam? Machen die dynamischen Allokationen von std::vector wirklich den Grossteil aus? Kann ich mir nicht gut vorstellen, gerade wenn der Algorithmus dahinter etwas komplexer wird.

    Ansonsten versuche mal std::vector::reserve() einzusetzen.


Anmelden zum Antworten