C ++ - Differenza tra (*). e ->?
-
20-09-2019 - |
Domanda
C'è qualche differenza in termini di prestazioni - o meno - tra:
ptr->a();
e
(*ptr).a();
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.