Wie in den Kommentaren und in der anderen Antwort gesagt, keinen Unterschied.
Operator generiert einen Aufruf an Operator, und da diese beiden Funktionen den gleichen Code haben, generieren sie die gleiche Assembly und damit die gleiche Leistung.
Aus Gründen der Vollständigkeit, habe ich versucht, mit Klirren 3.7 auf dem folgenden Eingabecode:
template <typename T>
class Vector {
private:
void** ptr;
public:
Vector(void** _ptr): ptr(_ptr) {}
T& operator[](const int iIndex) const {
return *(T*)ptr[iIndex];
}
T& Item(const int iIndex) const {
return *(T*)ptr[iIndex];
}
};
extern "C" int printf(const char* format, ...);
int main() {
double a[2] = { 1.0, 2.0 };
Vector<double> va((void**) &a);
double a1 = va[0];
printf("%lf\n", a1);
double a2 = va.Item(0);
printf("%lf\n", a2);
}
zusammengestellt mit:
clang -O3 -g -S -emit-llvm main.cpp -o main.ll
es erzeugt effektiv exakt die gleichen Linien:
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
entry:
%a.sroa.0.0.copyload = load double*, double** bitcast ([2 x double]* @_ZZ4mainE1a to double**), align 16, !dbg !57
%0 = load double, double* %a.sroa.0.0.copyload, align 8, !dbg !66, !tbaa !67
%call1 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), double %0), !dbg !72
%1 = load double, double* %a.sroa.0.0.copyload, align 8, !dbg !76, !tbaa !67
%call3 = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), double %1), !dbg !78
ret i32 0, !dbg !79
}
Vernachlässigbarer Unterschied, falls vorhanden. – erip
Der Operator-Aufruf verhält sich hier wie jeder andere Funktionsaufruf. Beide Funktionen haben dieselbe effektive Funktionssignatur. Warum sollten Sie einen Leistungsunterschied erwarten? – mindriot
Wie oben erwähnt, erzeugt der Operator einen Funktionsaufruf unter der Haube. Darüber hinaus werden sie wahrscheinlich in der optimierten binären inline, so dass sie genau die gleiche Baugruppe und damit die exakt gleiche Leistung generieren –