Domanda

C'è qualche differenza in termini di prestazioni - o meno - tra:

ptr->a();

e

(*ptr).a(); 

È stato utile?

Soluzione

Dal momento che si sta chiedendo nei commenti. Cosa si sono probabilmente cercando può essere trovato in Standard (accesso utente 5.2.5 Classe):

  

3 Se E1 ha il tipo “puntatore a classe   X “, quindi l'espressione E1-> E2 è   convertito alla forma equivalente   (* (E1)) E2;.

Il compilatore produrrà le stesse istruzioni esatte e sarà altrettanto efficiente. La macchina non si sa se hai scritto "->" o "*".

Altri suggerimenti

[Modifica]

Se la variabile è definito come T * (dove T è un certo tipo) allora sia -.> E * sono gli stessi (a meno ptr è nullo)

Se la variabile è un'istanza di una classe (per valore o per riferimento) allora -.> E * deve comportarsi stesso (per ottimale), ma questo richiede la classe di sovraccaricare nello stesso modo

L'operatore -> è speciale in quanto nella maggioranza dei casi "trapani-down" in modo ricorsivo fino a quando il risultato dell'espressione non è più qualcosa che ha un sovraccarico -> operatore definito per esso. L'espressione (*subxpression).x fa solo una dereferenziamento sulla sottoespressione, quindi se il risultato di (*subexpression) è un altro puntatore, allora questo non sarebbe compilare (si avrebbe bisogno di scrivere (*(*subexpression)).x Vedere il seguente codice per un illustrazione meglio:.

#include <iostream>
using namespace std;

class MyClass
{
public:
    MyClass() : x(0) {}
    int x;
};

class MyPtr
{
private:
    MyClass* mObj;
public:
    MyPtr(MyClass* obj) : mObj(obj) {}
    MyClass* operator->() 
    {
        return mObj;
    }
};

int main() 
{
    MyClass obj;
    MyClass* objCPtr = &obj;
    MyClass** objCHandle = &objCPtr;
    MyPtr ptr(&obj);
    cout << ptr->x << endl;
    cout << (*(*objCHandle)).x << endl;
}

Nota tuttavia, che questo non sarebbe la compilazione:

cout << objCHandle->x << endl;

Poiché il comportamento di drill-down -> verifica solo quando il lato sinistro dell'espressione è una classe, struct, unione, o di tipo generico. In questo caso, è un objCHandle MyClass **, in modo che non si qualifica.

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