Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 20:57

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Pass by value oder const reference

Discussion on Pass by value oder const reference within the C/C++ forum part of the Coders Den category.

Reply
 
Old 10/10/2015, 12:01   #16
 
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
Quote:
Originally Posted by _Roman_ View Post
Heißt das also, dass ich mit std::move und nem normalen QString Parameter arbeiten sollte, wenn Qt den String kopiert? Verlier grad etwas den Überblick bei den ganzen Informationen
"For direct connections, it is recommended that the values are passed by const reference to avoid needless copies. For queued connections Qt will make a copy no matter how you pass the arguments" sagt doch eigentlich alles. Nimm einfach ne konstante Referenz und kopier die. Mach dir nicht so viel Gedanken über diesen einen String, man wird kaum einen Unterschied merken.
th0rex is offline  
Thanks
1 User
Old 10/11/2015, 00:00   #17
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Quote:
Originally Posted by C0untLizzi View Post
Dann ist der typ von dem Parameter eigentlich std::string&&. Da wir die Funktion aber nur ein const std::string& annehmen lassen, wird diese Variante aufgerufen und wir bekommen keinen Vorteil dadurch, dass der Parameter eine rvalue Referenz eigentlich ist.
Sorry an den TE dass ich das hier ein bisschen kapere, aber das klingt nun doch ziemlich interessant. Hast du irgendwas dazu, dass aus der eigentlichen std::string(void)-Funktion eine std::string&&(void)-Funktion wird?
Ich vermute du spielst auf RVO an, stimmt das? Und wenn ja, ist irgendwo garantiert wie das funktioniert?

Weil für mich klingt das jetzt nicht so 100% logisch und standardkonform, ich finde dazu aber auch in Google nichts, und wenn du offenbar weißt wovon du sprichst, teilst du es sicher gerne

Padmak
Padmak is offline  
Old 10/11/2015, 02:28   #18


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,909
Received Thanks: 25,409
Quote:
Mach dir nicht so viel Gedanken über diesen einen String, man wird kaum einen Unterschied merken.
Ich muss dich korrigieren: Man wird keinen Unterschied bemerken.

Diese Art die Optimierung ist einfach nicht so viele Gedanken wert. Es geht hier nicht um einen Webserver oder etwas in der Art, der täglich eine riesige Menge von langen Strings in wenigen Millisekunden verarbeiten muss.

"Premature optimization is the root of all evil."
MrSm!th is offline  
Thanks
5 Users
Old 10/11/2015, 11:36   #19
 
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
Quote:
Originally Posted by Padmak View Post
Sorry an den TE dass ich das hier ein bisschen kapere, aber das klingt nun doch ziemlich interessant. Hast du irgendwas dazu, dass aus der eigentlichen std::string(void)-Funktion eine std::string&&(void)-Funktion wird?
Ich glaube da habe ich mich falsch ausgedrückt. An der Funktionssignatur wird nichts verändert.

Quote:
Originally Posted by Padmak View Post
Ich vermute du spielst auf RVO an, stimmt das? Und wenn ja, ist irgendwo garantiert wie das funktioniert?
Nein tue ich nicht. RVO findet innerhalb der Funktion statt (dh. in der Funktion die etwas zurück gibt). Ja es ist garantiert wie und wann das funktioniert.

Also. Grundsätzlich ist eine rvalue Referenz auch eine Referenz. Das heißt, dass sowas:
Code:
MyClass&& get()
{
    MyClass m;
    return std::move(m);
}
eine Referenz auf ein nicht mehr existierendes Objekt (m) zurück gibt (undefined behaviour). Deswegen wird der Compiler die Signatur auch nicht zu std::string&& get() ändern und man selber sollte es auch nicht (außer man weiß wirklich was man macht; die stl macht das bei dem operator* vom iterator z.B.). Dafür ist ja schließlich RVO/NRVO da.
Code:
std::string getMyVal()
{
     std::string ret = "......";
     return ret; // HIER findet NRVO statt, da ret nicht mehr genutzt wird darf der compiler das.
}
Aber RVO/NRVO hat nicht wirklich was, mit dem was ich gesagt habe zu tun. Es kann halt nur in der Funktion, die etwas zurück gibt, statt finden, aber mir ging es eher darum, welche Funktion aufgerufen wird, also um Overload Resolution.

Ich habe mich da definitiv falsch ausgedrückt. Der Typ von dem Rückgabewert ist und bleibt MyClass bzw. std::string.
Code:
MyClass getMyClass(){...}
void myFunc(const MyClass& m){...} // 1
void myFunc(MyClass&& m){...}//2

myFunc(getMyClass()); // 3
Bei Zeile 3 muss jetzt zuerst getMyClass() aufgerufen werden. Dann hat der Compiler da dieses Objekt vom Typ MyClass rumliegen und das ist defintiv temporär. RValue (=temporäre) Objekte können an lvalue und rvalue Referenzen gebunden werden, aber eine rvalue Referenz ist die bessere Übereinstimmung. Das heißt, wenn der Compiler jetzt die Funktion sucht, die aufgerufen werden soll, hätte man mit der 2. Funktionssignatur die bessere Übereinstimmung. Wenn die 2. Funktionsignatur nicht existiert, weil der Programmierer sie nicht geschrieben hat, dann wird die 1. Funktion aufgerufen.
th0rex is offline  
Reply


Similar Threads Similar Threads
Is there a packet reference available
04/24/2012 - CO2 Private Server - 14 Replies
Hello everyone, I might start working on a private server in Java after my finals are over so I have question to ask you guys. Is there any packet reference guide like Korvacs wiki still available for me to use? I know that I can simply download some of the public sources to get the structures and use that but I would just like to know if one still exists. Thanks, Tkblackbelt
Looking for a reference
11/08/2011 - Dekaron Private Server - 8 Replies
We are sorry but we just got this letter and we comply with the msg " To Elitepvpers The account Cataracts - Daemon Strother has been reported for multiple crimes by the US state department of illegal Child sexual abuse! law § 2243 - Sexual abuse of a minor or ward: (a) Of a Minor.— Whoever, in the special maritime and territorial jurisdiction of the United States or in a Federal prison, or in any prison, institution, or facility in which persons are held in custody by direction of or...
[S] 3€ handyguthaben [B] 3Day Pass + 3 Promo Codes oder 10Day Pass
06/02/2011 - WarRock Trading - 1 Replies
Heai Epvpers. Ich Suche jemanden der seine Handykarte zur verfügung stellt. Es müssen mindestens 3€ auf der karte vorhanden sein. Es würde so Funktionieren , ihr sagt mir eure Handynummer dann geb ich sie auf einer seite ein und ihr beckommt einen Code per sms zugesendet , diesen Code sagt ihr mir dann. Nachdem ich diesen Code Abgegeben habe beckommt ihr mehrere SMS und euch werden 3€ vom Guthaben abgebucht. Nach dem das geschehen ist habe ich auf einem Konto von einer Anderen Seite ein...
My Reference For Cheats
02/23/2011 - Facebook - 0 Replies
The Website Which Gives/Shares To Me New,Fresh,100% Working Cheats Is facebookgamestricks.tk Visit The Page And See More Cheats Up Everyday There Are 5 Cheats Fresh Please Cooperate
just a reference
11/26/2008 - Dekaron Exploits, Hacks, Bots, Tools & Macros - 0 Replies
havnt been on for some time i dont know if its any help at all this is an old sheet i used to use to find things quicker with winhex though id post it :) If someone else has posted it im sorry in advance :handsdown: the way i use it is simple just say i wanted to find a Great mana potion all i would do is click the search tab in winhex then find text then enter 3806 then it should be the first item that pops up with a line that looks like 3806,Great Mana...



All times are GMT +1. The time now is 20:57.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.