Есть ли разница в производительности - или иначе - между:C++ - Разница между (*). и ->?
ptr->a();
и
(*ptr).a();
?
Есть ли разница в производительности - или иначе - между:C++ - Разница между (*). и ->?
ptr->a();
и
(*ptr).a();
?
Поскольку вы просите его в комментариях. То, что вы, вероятно, ищете можно найти в стандарте (доступ к члену 5.2.5 Class):
3 Если E1 имеет тип «указатель на класс X», то выражение E1-> Е2 преобразуется в эквивалентную форму (* (E1)). E2;
Компилятор выдаст точные инструкции, и он будет таким же эффективным. Ваша машина не будет знать, написали ли вы «->» или «*.».
[Редактировать]
Если переменная определена как T * (где Т некоторый тип), то оба -> и * являются одинаковыми (если PTR не равно нулю).
Если переменная является экземпляром класса (по значению или по ссылке), то -> и * должны вести себя одинаково (за лучшую практику), но для этого требуется, чтобы класс перегружал их одинаково.
-> и * не работают на самих типах T, но на типе T *, который является указателем. –
Если базовый класс * * перегружает '->' или '*', он должен перегружать оба, чтобы он оставался прежним. Иначе это плохо спроектировано. –
@Brian '->' и '*' работают на все, что определяет 'operator->' и 'operator *'. * И * также для всех типов указателей. –
Оператор ->
является особенным в том, что в большинстве случаев он «сверлит-вниз» рекурсивно, пока результат выражения больше не является чем-то, для которого определен оператор перегрузки ->. Выражение (*subxpression).x
делает только один разыменования на подвыражения, так что если результат (*subexpression)
еще один указатель, то это не будет компилировать (вам нужно будет написать (*(*subexpression)).x
Смотрите следующий код для лучшей иллюстрации:.
#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;
}
однако следует отметить, что это не будет составлять:.
cout << objCHandle->x << endl;
Поскольку сверло вниз поведение -> только возникает, когда левая часть выражения является класс, структура, объединение, или обобщенный тип В этом случае, objCHandle - это MyClass **, поэтому он не подходит.
@Jeremy: Я добавил несколько обратных шагов, чтобы остановить звездочки от интерпретации команд форматирования :). –
@Andrew: спасибо! –
Да. Это то, что я искал - независимо от того, являются ли они одинаковыми. – Rachel