Vector vor erneuter Zuweisung leeren?



  • Jepp, er nu wieder! 😃

    vector <string> test()
    {
    	vector <string> vs;
    	string s ("ABC");
    	vs.push_back (s);
    	return vs;
    }
    int main() 
    { 
    	vector <string> v;
    	for ( int i=0; i<10; i++ )
    	{
    		v = test();
    		v.clear(); // Kann man die Zeile auch weglassen?
    	}
    	return 0;
    }
    

    Ich frage mich gerade: was passiert eigentlich, wenn man die Zeile 14 weglässt?
    Die Daten müssten dann irgendwo im RAM bleiben, ohne das man rankommt oder?



  • Ich schätze mal, dass der Speicherbereich einfach überschrieben wird.



  • Ich würde die Zeile sogar weglassen. Schliesslich überschreibt operator= den std::vector so oder so, unabhängig davon, was vorher im Container gespeichert war.



  • Und wenn die Inhalte unterschiedlich werden? Also z.B. erster Aufrufer bekommt("ABCDE"), der zweite bekommt ("ABC"). Dann müsste ja vom ersten etwas im RAM übrig bleiben, oder?



  • Was gegebenenfalls im std::vector oder std::string übrig bleibt, wenn er verkleinert wird, hat dich nicht zu interessieren. Das ist implementierungsabhängig und es gibt keinen standardkonformen Weg, an diese Daten zu gelangen. Aber wie gesagt, dafür gibt es auch keinen Grund.

    Edit: Falls es dir darum geht, dass die Container richtig aufräumen: Darum musst du dir keine Sorgen machen, das werden sie tun - spätestens im Destruktor.



  • Nexus schrieb:

    Ich würde die Zeile sogar weglassen. Schliesslich überschreibt operator= den std::vector so oder so, unabhängig davon, was vorher im Container gespeichert war.

    Eventuell wäre es sogar "performancelastiger" (minimal), weil du ja erst wieder Löschoperationen einleiten musst und du somit den bereits reservierten Speicher neu belegst.



  • Kóyaánasqatsi schrieb:

    Eventuell wäre es sogar "performancelastiger" (minimal), weil du ja erst wieder Löschoperationen einleiten musst und du somit den bereits reservierten Speicher neu belegst.

    clear() sollte eigentlich keinen Speicher freigeben, sondern nur die genutzte Grösse auf Null zurückschrauben. Von daher wird es wohl mehr oder weniger auf dasselbe hinauslaufen. Im Zweifelsfall ist nur ein operator= wohl ganz wenig schneller.

    Aber abgesehen von solchen Optimierungsüberlegungen ist es auch semantisch nicht sinnvoll, einen Container mit clear() zu leeren, nur um ihn dann wieder zu überschreiben.



  • Bueno, ¡muchas gracias señores!


Anmelden zum Antworten