Kdyz o tom tak premyslim, napada me otazka, zda optimalizece RWO neni trocu ohjebak na rovnak.
Ja to vzdycky chapal, tak, ze lokalni promena se pri navratu z funkce rusi. Tudiz pokud ji vracim hodnotou, je nutne ji vytvorit znovu (do kontextu volajici funkce). Pokud ji vsak vracim ukazatelem mam pruser, protoze bude po navratu z funkce ukazovat nekam kde nic uz nema nic byt. Pokud ji vsak vracim referenci, prekladac v ramci optimalizace promenou presune do kontextu volajici funkce. A funguje to i v pripade ze promennou vracim z ruznych casti volane funkce. Pracuji tak retezcove tridy, nebo retezitelne operatory.
Proc je to tedy potreba, jenom kvuli korutinam? Neni to spis zavadeni dalsi komplexity do jazyka? Nehodilo by se spis varovani kompiletoru, ve smyslu : "Pozor budes tvorit novy objekt, nechces radeji vracet referenci"?
RVO určitě potřebuješ, pokud static T foo() je použit jako konstruktor... Je to alternativní způsob konstrukce objektu, zejména oblíbená lidmi, kteří umí i v Rustu (jo trochu si utahuju).
Ale primárně to beru tak, že prostě vrácením objektu chci udělat jeho "přesun" z kontextu do kontextu. A pokud se to podaří bez fyzického přesunu, je to optimalizace.
Tuhle optimalizaci používám právě u coro::future, kdy je třeba získat pointer na tenhle objekt před tím, než je vrácen volajícímu. A potřebuju zajistit, že ten pointer platí i po návratu z té funkce. Proto má zakázaný kopírování a přesun.
Pozor na to, že reference je jiný pointer, takže i u reference můžeš vrátit něco, co referuje něco kde nic není. Na mechanismus prodlužování lifetime referencí bych nespoléhal, ne každý ty pravidla zná
Diky za doplneni ted uz to dava vetsi smysl.
Ondro, muzu te poprostit jeste trochu vice rozvest ten posledni odstavec o referencich, nebo nemas po ruce treba link na nejaky clanek/diskuzi, kde se to vice rozebira? Posledni dobou me dost zaujaly funktory a hodne ted s temito zajmavymi tridami experimetuji a opiram se prave o reference a o tento mechanizmus, takze me to hodne zajima (obvzvlaste zakernosti, ktere nejsou na prvni pohled zrejme).
Jenom na okraj - dokonce jsem si vsiml, ze kdyz o funktorech sveho casu psal do Chipu pan Jaroslav Franek (Jak se na funktor vola), tak tam zminoval past pri predavani instance funktoru do funkce hodnotou. Prislo mi divne proc jednu z moznosti neuvedl prave predani pomoci reference, ktere by cely problem jednoduse vyresilo. Ze by by ho to nenapadlo? To se mi nezda. Tak asi k tomu mel nejaky duvod, jen ho nenapsal.
Dik :)
Asi bych chtěl vidět přímo kus zdrojového kódu, kde to používáš.
Jinak dobrý zdroj informací jsou CppCony. Ohledně referencí jsem si vzpomněl na tenhle
https://youtu.be/XN__qATWExc?si=ORLiGVHzFmC03jPi
Sice mně to nic moc nedalo, většinu jsem věděl dřív, než to speaker vysvětlí, ale někomu to asi pomůže
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 51 190×
Přečteno 24 017×
Přečteno 22 904×
Přečteno 21 069×
Přečteno 17 807×