C ++ Pointers: numero di livelli di Indirection

3

In un programma C ++ che non contiene codice C legacy, esiste una linea guida per quanto riguarda il numero massimo di livelli di riferimento indiretto che dovrebbero essere usati nel codice sorgente? So che in C (al contrario di C ++), alcuni programmatori hanno usato puntatori a puntatori per un array a più dimensioni, ma nel caso degli array, ci sono strutture di dati in C ++ che possono essere utilizzate per evitare i puntatori ai puntatori.

Gli utenti che ancora creano puntatori a puntatori (o più di questo) cercano di utilizzare i puntatori ai puntatori solo per le prestazioni ETC. motivi?

Ho provato a NON usare più di un puntatore a un puntatore, solo nel caso in cui un puntatore necessitasse di modifica; qualcuno ha altre linee guida o regole ufficiali o non ufficiali riguardo al numero di livelli di riferimento indiretto?

    
posta A B 18.12.2012 - 00:36
fonte

3 risposte

4

Non ci sono linee guida o limiti pratici sull'indirizzamento indiretto. Non c'è una buona ragione per mettere un vincolo come questo a meno che tu non abbia a che fare regolarmente con diversi livelli di riferimento indiretto in un caso indicativo di un design sciatto.

Vale a dire che ci sono casi validi in cui ci si possono attendere 4, 5, 6 o più livelli di riferimento indiretto, ma questi sono rari e non dovrebbero in genere apparire nel codice a meno che qualcuno non abbia fatto qualcosa di terribile, non direttamente relativo al livello di riferimento indiretto utilizzato.

Se ti stai ritrovando a utilizzare, ad esempio, 3 o più livelli di riferimento indiretto, dovresti probabilmente valutare se è necessario modificare la tua architettura.

Ma questo significa che non dovresti mai permettere più di 3 livelli di indirezione? Assolutamente no. Significa semplicemente che potrebbe potenzialmente un'indicazione che potrebbe possibilmente essere un'inefficienza intrinseca nell'architettura del tuo codice. Niente di più. (Prendi nota della vaghezza voluta di questa affermazione: è una mera possibilità che qualcosa possa portare a un problema, non necessariamente un problema reale.)

    
risposta data 18.12.2012 - 01:15
fonte
2

Si noti che un elenco collegato di 42 elementi contiene 42 livelli di riferimento indiretto per accedere all'ultimo elemento. Per ottenere l'elemento di un elenco di un elemento, si utilizza una sola indiretta: dato un puntatore alla lista, si fa qualcosa come p->data . Per ottenere il secondo elemento, sono necessarie due istruzioni indirette: p->next->data . Ogni freccia è un indiretto. Solo, la notazione non è solo una riga di **** . Ovviamente, p->next è in realtà (*p).next . Quindi potresti scriverlo come (*(*(*p).next).next).data . Se vuoi vedere quarantadue asterischi, puoi farlo.

Se il campo next dell'elenco collegato si trova all'inizio della struttura, a livello macchina è proprio l'equivalente di (***...***p).data , dove solo l'accesso finale a data utilizza un offset.

E, naturalmente, le strutture ad albero contengono molti livelli di riferimento indiretto, in particolare se il loro fan-out è basso, come gli alberi binari di ricerca, e in particolare se sono autorizzati a diventare sbilanciati.

    
risposta data 18.12.2012 - 03:34
fonte
0

È ESTREMAMENTE raro che sia effettivamente una buona idea scrivere codice con più di un livello di riferimento indiretto in ogni dato istante.

In parte questo perché la prudenza impone di controllare ogni puntatore di NULL prima di dereferenziarlo, ed è difficile farlo se scrivi più di un livello di riferimento indiretto.

In parte questo è dovuto al fatto che i processori moderni hanno una cache dei dati complicata e schemi di allocazione della memoria ancora più complicati, e il superamento di più livelli di riferimento indiretto (attraverso lunghe catene di puntatori) può distruggere la sacra cache.

Ho visto processori in grado di fornire risultati errati se si esegue il thrash della cache in determinati modi. (Sì, questi sono problemi hardware No, il venditore NON risolverà i problemi in tempi brevi, e in ogni caso quei chip sono già sul campo.) Ho risolto personalmente un problema, che puzzava come uno di quelli, in un processore per il quale il produttore aveva già messo in guardia su problemi come questo, riscrivendo il codice per fare molta attenzione alla localizzazione dei riferimenti. (Non ho fatto la riscrittura perché sospettavo una cache battuta. Ho scoperto il problema più tardi.Io ho fatto la riscrittura perché il codice originale era una pila illegittima di spaghetti e puntatori ai puntatori ai puntatori. Stavo inseguendo appena svanito rapidamente e silenziosamente.)

E parte di esso è dovuto al fatto che il codice che esegue solo un livello di riferimento indiretto è solitamente MOLTO più facile da comprendere per lo scarso livello di manutenzione.

    
risposta data 18.12.2012 - 05:45
fonte

Leggi altre domande sui tag