Una regola importante per rendere appetibile un articolo ai programmatori è avere qualche trucco o tecnica che possa elevare i nostri software al di sopra degli altri e soprattutto inserire la parola “Come …” spiegando il procedimento da applicare. Qual’è allora il vero valore di un trucco ed i costi per attuarlo. Le migliori tecniche di programmazione discendono infatti da assunzioni che risiedono nei meandri di un sistema operativo oppure nell’hardware di un computer.
Un programmatore che ha qualche anno di esperienza ricorda bene come occorreva ottimizzare il codice, soprattutto per quello che riguardava l’uso dell’aritmetica dei puntatori anziché array ed indici. Il compilatore infatti deve compiere delle orribili moltiplicazioni per accedere ad un elemento di un array attraverso gli indici, operazione molto più veloce tramite l’incremento dei puntatori. Altra tecnica per velocizzare il codice è utilizzare il pre-incremento nelle somme piuttosto che il post-incremento, questo perché nel secondo caso il compilatore deve restituire il valore non ancora incrementato ( fenomeno che si nota bene quando si ricorre all’overloading degli operatori di somma ). Come esempio vediamo un programma che scorre due vettori ed inserisce il risultato della somma degli elementi in un terzo vettore.
#include <iostream> using namespace std; void Somma_Array(int* pia, int* pib, int* pic) { for (int i = 0; i < 5; i++) pic[i] = pia[i] + pib[i]; } void main (void) { int a[] = {5, 12, 21, 54, 12}; int b[] = {7, 9, 6, 21, 15}; int c[5]; Somma_Array(a, b, c); cout << "L'array iniziale a: "; for (int i = 0; i < 5; i++) cout << a[i] << ", "; cout << endl << endl; cout << "L'array iniziale b: "; for (int i = 0; i < 5; i++) cout << b[i] << ", "; cout << endl << endl; cout << "L'array risultato: "; for (int i = 0; i < 5; i++) cout << c[i] << ", "; cout << endl << endl; system("pause"); }
Questo metodo è poco performante rispetto all’uso dei puntatori.
#include <iostream> using namespace std; void Somma_Array(int* pia, int* pib, int* pic) { for (int i = 0; i < 5; i++) *(pic++) = *(pia++) + *(pib++); } void main (void) { int a[] = {5, 12, 21, 54, 12}; int b[] = {7, 9, 6, 21, 15}; int c[5]; Somma_Array(a, b, c); cout << "L'array iniziale a: "; for (int i = 0; i < 5; i++) cout << a[i] << ", "; cout << endl << endl; cout << "L'array iniziale b: "; for (int i = 0; i < 5; i++) cout << b[i] << ", "; cout << endl << endl; cout << "L'array risultato: "; for (int i = 0; i < 5; i++) cout << c[i] << ", "; cout << endl << endl; system("pause"); }
E meglio ancora l’uso dei puntatori con il pre-incremento.
#include <iostream> using namespace std; void Somma_Array(int* pia, int* pib, int* pic) { --pia; --pib; --pic; for (int i = 0; i < 5; ++i) *(++pic) = *(++pia) + *(++pib); } void main (void) { int a[] = {5, 12, 21, 54, 12}; int b[] = {7, 9, 6, 21, 15}; int c[5]; Somma_Array(a, b, c); cout << "L'array iniziale a: "; for (int i = 0; i < 5; ++i) cout << a[i] << ", "; cout << endl << endl; cout << "L'array iniziale b: "; for (int i = 0; i < 5; ++i) cout << b[i] << ", "; cout << endl << endl; cout << "L'array risultato: "; for (int i = 0; i < 5; ++i) cout << c[i] << ", "; cout << endl << endl; system("pause"); }
Dal codice possiamo notare come abbiamo dovuto decrementare i puntatori iniziali per poterli utilizzare all’interno di un ciclo, da osservare che in alcuni compilatori questo processo iniziale potrebbe causare un’eccezione. L’uso di ottimizzazione del codice con trucchi e tecniche speciali era utile sui primi compilatori degli anni settanta, in uno di quelli moderni la versione più veloce è la prima, nonostante si utilizzi gli indici. Questo fenomeno accade perché i moderni compilatori ottimizzano da soli il codice al momento della compilazione del sorgente ed inoltre non danno vita ad eccezioni. In pratica il mio consiglio è quello di non utilizzare trucchi e tecniche furbe fatte in casa, perché ora sono i compilatori che fanno questo lavoro per noi automaticamente e decisamente meglio.
Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…
MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→
In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…
In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…
Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…
Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→