Hirdetés

Új hozzászólás Aktív témák

  • jattila48

    aktív tag

    A http://nyelvek.inf.elte.hu/leirasok/C++0x/index.php?chapter=5 ELTE jegyzetben a move szemantikánál találtam az alábbi, szerintem hibás példát:

    std::vector<int> && function() {
    std::vector<int> ret; // ret feltöltése jó sok adattal
    return ret;
    }

    Azt akarja bemutatni, hogy hogy kell rvalue referenciát visszaadni, a költséges másolás elkerülése érdekében. Csakhogy a ret lokális változóra vonatkozó referenciát ad vissza, ami megszűnik visszatérés után. Ugyanígy lokális változóra vonatkozó lvalue referenciát, vagy pointert sem szabad visszaadni. Ha mindenképpen a move szemantikát akarja használni, akkor az

    std::vector<int> function() {
    std::vector<int> ret; // ret feltöltése jó sok adattal
    return std::move(ret);
    }

    lenne erre megfelelő. Még jobb, ha egyszerűen érték szerint adja vissza.

    std::vector<int> function() {
    std::vector<int> ret; // ret feltöltése jó sok adattal
    ret;
    }

    A modern fordítók RVO optimalizációt hajtanak végre (se copy, se move ctort nem hívnak), vagy ha ez nem lehetséges, akkor automatikusan a move szemantikát használják (a ret-et std::move nélkül is rvalue-nak tekintik, mert visszatérés után megszűnik). A return std::move(ret) elveszi az RVO optimalizáció lehetőségét, és a költségesebb move szemantikát alkalmazza, ezért ne használjuk. Azt azért furcsállom, hogy egy ilyen súlyos hiba benne maradhat egy ELTE jegyzetben. Egyébként általában is nagyon ritka esetben kell rvalue referenciát visszaadni. SOHA ne adj vissza lokális változóra vonatkozó pointert, lvalue vagy rvalue referenciát!!!
    Vélemények?

Új hozzászólás Aktív témák