Return by reference sehr langsam??



  • Hallo!

    Ich probiere einen vector aus einer Funktion per reference zurückzugeben. Ich habe dabei bemerkt, dass das aber verdammt langsam ist. Gleich langsam, als wenn ich eine Kopie des vectors zurückgebe.
    Ich habe wirklich keine Ahnung warum das so ist. Kann mir das bitte wer erklären?

    #include <vector>
    using namespace std;
    
    struct st {
    	float a, b, c;
    };
    
    class A {
    public:
    	vector<st> vec;
    	void initialize() {
    		for(int i = 0; i < 900; i++)
    			vec.push_back(st());
    	}
    	vector<st>* getValues1() {
    		return &vec;
    	}
    
    	vector<st>& getValues2() {
    		return vec;
    	}
    
    	vector<st> getValues3() {
    		return vec;
    	}
    };
    
    void main() {
    	A a;
    	a.initialize();
    	for(int i = 0; i < 50000; i++) {
    		vector<st>* t = a.getValues1(); // fast
    	}
    
    	for(int i = 0; i < 50000; i++) {
    		vector<st> t = a.getValues2(); // slow
    	}
    
    	for(int i = 0; i < 50000; i++) {
    		vector<st> t = a.getValues3(); // slow
    	}
    }
    


  • Was erwartest du, wenn du a) ohne optimierungen compilierst und b) explizit den Rückgabewert kopierst?

    oh, und mach das initialize weg und benutze stattdessen ordentliche Konstruktoren.



  • Danke für deine schneller Antwort. Ist nur ein Beispielprogramm, muss nicht schön sein. 🙂
    Also die Funktion getValues2() sollte doch eine Referenz zurückgeben. Also gebe ich doch nicht den kompletten vector zurück. Sollte das nicht gleich schnell sein, als wenn ich per pointer (getValues1) zurückgebe?



  • vector<st> t = a.getValues2();
    

    Die Funktion selbst eine Referenz zurück, aber trotzdem wird zu t kopiert. Ändere das zu

    vector<st>& t = a.getValues2();
    


  • otze schrieb:

    Was erwartest du, wenn du a) ohne optimierungen compilierst und b) explizit den Rückgabewert kopierst?

    oh, und mach das initialize weg und benutze stattdessen ordentliche Konstruktoren.

    Du kopierst explizit den Rückgabewert, nightrider.

    vector<st> t = a.getValues2();
    

    t wird hier zu einer Kopie.



  • Stimmt, so geht das, danke!


Anmelden zum Antworten