Domanda

Ho una domanda circa la prestazione del costruttore mossa, pseudo classe C ++:

typedef tuple<std::string, std::vector<double>, ...and more...> FooTupleMember;

class Foo1
{
    public:
        Foo1::Foo1 (Foo1&& object) :
            member (std::move (object.member))
        {
            // ...
        }
    private:
        FooTupleMember member;
};

class Foo2
{
    public:
        Foo2::Foo1 (Foo2&& object) :
            member (std::move (object.member))
        {
            // ...
        }
    private:
        std::unique_ptr<FooTupleMember> member;
};

Quando sposto oggetto di foo1 di classe si inizializza costruttori spostare di tutti gli oggetti memorizzati in tupla giusto? Questo, che l'operazione media mossa può essere molto costoso.

Ma mi muovo oggetto di foo2 classe intera operazione di spostamento è molto più veloce perché mi passa solo puntatore interno di dati memorizzati in puntatore intelligente, giusto?

riferimento R-valore è più veloce allora l-value rispetto, perché la richiedono meno operazioni di copia, questo è ovvio. Tuttavia restituendo l'oggetto da funzione utilizzando il costruttore mossa è ancora più costoso di memorizzazione stesso oggetto in puntatore intelligente e ritorno puntatore intelligente.

Spostamento di oggetti tramite l-value è molto lento, lo spostamento tramite puntatore intelligente è molto veloce e spostandolo via r-value è da qualche parte nel mezzo.

Non vedo "il potere" di R-valore, perché non è efficace come molti dicono. Utilizzando puntatore intelligente al posto di r-valore è IMHO meglio (intendo veloce) ed il codice elegante e chiaro. Ho ragione?

È stato utile?

Soluzione

Se la classe ha un sacco di membri, allora si deve spostare tutti loro (o abbastanza per il passaggio a un senso in ogni caso). Questo sta andando sempre essere più costoso di spostare un singolo puntatore (smart), ma è probabile che meno costoso di copiare.

Tuttavia, la memorizzazione dei dati sul mucchio in modo da potervi accedere tramite un puntatore (per fare movimento veloce) avrà un impatto sulla performance del resto del codice, dal momento che ogni accesso deve dereference il puntatore.

Profilo e ottimizzare i bit lenti. Se lo spostamento non è un collo di bottiglia, poi fare ciò che rende il resto del codice più veloce, e viceversa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top