È un'opzione più ottimizzata rispetto all'altra?
Bene, vediamo, in pratica, il codice assembler generato con MSVC2013 (non ottimizzato la modalità di debug):
; 21 : array[i] = 8;
mov eax, DWORD PTR _i$[ebp]
mov DWORD PTR _array$[ebp+eax*4], 8
; 22 : *(array + i) = 8;
mov eax, DWORD PTR _i$[ebp]
mov DWORD PTR _array$[ebp+eax*4], 8
Bene, con tutta la buona volontà, non riesco a vedere alcuna differenza nel codice generato.
A proposito, qualcuno ha scritto di recente su SO: l'ottimizzazione prematura è la radice di tutti i mali. Il tuo insegnante dovrebbe saperlo!
Uno ha un vantaggio rispetto all'altro?
Chiaramente, l'opzione uno ha il vantaggio di essere intuitiva e leggibile. Option2 diventa rapidamente UNREADABLE in applicazioni matematiche.
Esempio 1: distanza di un vettore matematico 2D implementato come una matrice.
double v[2] = { 2.0, 1.0 };
// option 1:
double d1 = sqrt(v[0] * v[0] + v[1] * v[1]);
//option 2:
double d2 = sqrt(*v**v + *(v + 1)**(v + 1));
In effetti, la seconda opzione è davvero fuorviante a causa della **
, perché si deve leggere attentamente la formula per capire se si tratta di un doppio dereference o di una moltiplicazione per un puntatore Dereferenced. Non si parla di persone che potrebbero trarre in inganno da alcuni altri linguaggi come ADA in cui **
significa 2 "potere"
Esempio: calcolo del determinant di una matrice 2x2
double m[2][2] = { { 1.0, 2.0 }, { 3.0, 4.0 } };
// option 1
double dt1 = m[0][0] * m[1][1] - m[1][0] * m[0][1];
// option 2
double *x = reinterpret_cast<double*>(m);
double dt2 = *x **(x+2*1+1) - *(x+2*1) * *(x+1);
Con Arays multidimensionali, opzione 2 è un incubo. Si noti che:
ho usato una temporanea un puntatore tridimensionale x
essere in grado di utilizzare la formula. L'utilizzo di m qui avrebbe causato messaggi di errore di compilazione fuorvianti.
devi conoscere il layout preciso del tuo oggetto e devi introdurre la dimensione della prima dimensione in ogni formula!
Immagina che in seguito desideri aumentare il numero di elementi nel tuo array 2D. Dovrai riscrivere tutto!
gap semantico
Che cosa il vostro insegnante non è presente qui, è che l'operatore []
ha un significato che è ben compreso dal compilatore e il lettore. È un'astrazione che non dipende da come la struttura dei dati viene implementata nella realtà.
Supponiamo di avere un array e un codice molto semplice:
int w[10] {0};
... // put something in w
int sum = 0;
for (int i = 0; i < 10; i++)
sum += w[i];
In seguito si decide di utilizzare un std::vector
al posto di un array, in quanto si è appreso che è molto più flessibile e potente. Tutto quello che dovete fare è cambiare la definizione (e inizializzazione) di w
:
vector<int> w(10,0);
Il resto del codice funzionerà, perché la semantica del []
è la stessa per i due strutures dati. Vi lascio immaginare cosa sarebbe hapened se avresti usato il consiglio del tuo insegnante ...
Sarei estremamente preoccupato per le altre cose che il tuo professore universitario ti dirà, se già per le cose di base egli fa affermazioni del genere! La seconda versione come il chiaro vantaggio di offuscare il tuo codice senza ulteriore sforzo – Christophe
_ @E_Tony_ Puoi chiarire il tipo di elemento dell'array concreto in questione per favore? –
Ben fatto per chiederlo. –