Alias pointer shortcut

di il
7 risposte

Alias pointer shortcut

Un saluto a tutti,
ho un quesito che mi assilla da qualche tempo.
Cercherò di farmi capire con un po' di codice:

	for( unsigned i = 0; i < model->pMesh->nTriangles; i++ )
	{
		vx = pVertex[model->pMesh->pTriangle[i].va-1].x;
		vy = pVertex[model->pMesh->pTriangle[i].va-1].y;
		vz = pVertex[model->pMesh->pTriangle[i].va-1].z;
	}
Ora, allo stesso modo posso scrivere:

	_Triangle *short = model->pMesh->pTriangle;

	for( unsigned i = 0; i < model->pMesh->nTriangles; i++ )
	{
		vax = pVertex[short[i].va-1].x;
		vay = pVertex[short[i].va-1].y;
		vaz = pVertex[short[i].va-1].z;
	}
Nell'ultimo caso ho creato e definito il puntatore short in modo che funzioni come alias e scorciatoia di model->pMesh->pTriangle.
Il mio quesito è: vale la pena creare un tale alias? Voglio dire, permette di guadagnare in performance o è solo solo una comodità mnemonica?

7 Risposte

  • Re: Alias pointer shortcut

    Prima di tutto ti consiglio di cambiare il nome 'short' in quacos'altro che non sia una parola chiave del C (te lo compila? ).
    Per rispondere alla tua domanda, invece, dipende tutto dal compilatore e dal grado di ottimizzazione: di sicuro utilizzare un puntatore di "comodo" rende il tutto moooolto più leggibile!
  • Re: Alias pointer shortcut

    Sicuramente con 'short' non me lo compila perché l'ho chiamato così al volo sul forum, come abbreviazione di "shortcut", e non ci avevo proprio pensato.

    La comodità di avere un identificatore mnemonico per quella catena di accessi a dati strutturati è indubbia. La mia motivazione in questo momento è la "best practice" rivolta alle prestazioni, perché mi immagino che la macchina che dovrà eseguire quelle istruzioni ha la possibilità di accedere ai dati con un semplice indirizzo anziché pescare un indirizzo di memoria mediante una concatenazione di accessi. Magari mi sbaglio, magari il compilatore risolve quel percorso in un solo passo, ma io non lo so.

    In tale ottica, questa mattina ho dichiarato la quel puntatore con restrict:
    	_Triangle * restrict pShortCut = model->pMesh->pTriangle;
    sapendo che nel suo contesto, pShortCut sarà l'unico puntatore ad accedere a quella posizione di memoria.
  • Re: Alias pointer shortcut

    L'unico consiglio che posso darti è quello di adottare un nome attinente con la problematica, pShortCut non ha attinenza con il problema (sarebbe come chiamare "intero" in int); meglio sarebbe forse pMeshTriangle ma questo lo puoi sapere solo tu
  • Re: Alias pointer shortcut

    In alcuni casi può essere molto utile, come nel tuo.
    In linea generale quando si usa questo approccio una cosa molto importante è evitare il "famoso" problema dei Dangling Pointers.
    Nel caso specifico se pTriangle viene deallocato, pShortCut punta a qualcosa che non esiste più e diventa un puntatore che accede ad un'area di memoria deallocata o che comunque contiene altro.
    Il tutto però dipende anche dallo scope di pShortCut nonché dal grado di parallelismo (Se mentre usi pShortCut qualcuno dealloca pTriangle iniziano ad arrivare i problemi di concorrenza e gestione delle sezioni critiche, ma questo è un altro discorso) .
  • Re: Alias pointer shortcut

    Si, infatti. Il puntatore "scorciatoia", che qui ho chiamato pShortCut, ha un life-time locale nell'ambito di un ciclo for o do-while, senza semafori o altri intermezzi che possano permettere la deallocazione dell'indirizzo originario.
  • Re: Alias pointer shortcut

    Alla fine mi sono preso il tempo di misurare i clock ticks impiegati nei due casi utilizzando la funzione clock() imponendo cicli di 4000000000 iterazioni.

    Dunque, un'istruzione come questa:
    pModel->mesh->tri->mat->name = pName;

    impiega circa 2.5 tempi in più rispetto alla sua scorciatoia:
    pShortcut->name = pName;

    Dove:
    pShortcut = pModel->mesh->tri->mat;

    Senza significative differenze alle diverse impostazioni di ottimizzazione del compilatore.
  • Re: Alias pointer shortcut

    Beh, ma era ovvio ...
Devi accedere o registrarti per scrivere nel forum
7 risposte