Domanda

I sistemi richiedono che determinate primitive siano allineate a determinati punti all'interno della memoria (ints a byte multipli di 4, short a byte multipli di 2, ecc.). Naturalmente, questi possono essere ottimizzati per sprecare il minimo spazio nell'imbottitura.

La mia domanda è: perché GCC non lo fa automaticamente? In qualche modo manca l'euristica più ovvia (le variabili di ordine dal più grande requisito alla più piccola)? Parte del codice dipende dall'ordinamento fisico delle sue strutture (è una buona idea)?

Lo sto chiedendo solo perché GCC è super ottimizzato in molti modi, ma non in questo, e sto pensando che ci debba essere una spiegazione relativamente interessante (di cui sono ignaro).

È stato utile?

Soluzione

gcc non riordina gli elementi di una struttura, perché ciò violerebbe lo standard C. La sezione 6.7.2.1 della norma C99 afferma:

  

All'interno di un oggetto struttura, i membri non-bit - & # 64257; eld e le unità in cui bit - & # 64257; elds   risiedono indirizzi che aumentano nell'ordine in cui sono dichiarati.

Altri suggerimenti

Le strutture sono spesso utilizzate come rappresentazioni dell'ordine di impacchettamento dei formati di file binari e dei protocolli di rete. Questo si spezzerebbe se fosse fatto. Inoltre, compilatori diversi ottimizzerebbero le cose in modo diverso e collegando il codice insieme da entrambi sarebbe impossibile. Questo semplicemente non è fattibile.

GCC è più intelligente di molti di noi nel produrre codice macchina dal nostro codice sorgente; tuttavia, rabbrividisco se è stato più intelligente di noi nel riordinare le nostre strutture, dal momento che sono dati che ad es. può essere scritto in un file. Una struttura che inizia con 4 caratteri e quindi ha un numero intero di 4 byte sarebbe inutile se letta su un altro sistema in cui GCC ha deciso di riorganizzare i membri della struttura.

gcc SVN ha un'ottimizzazione della riorganizzazione della struttura (-fipa-struct-reorg), ma richiede un'analisi dell'intero programma e al momento non è molto potente.

I compilatori C non impacchettano automaticamente le strutture proprio perché di problemi di allineamento come quelli menzionati. Gli accessi non al limite delle parole (32 bit sulla maggior parte delle CPU) comportano pesanti penali su x86 e causano trappole fatali sulle architetture RISC.

Non dire che è una buona idea, ma puoi sicuramente scrivere codice che si basa sull'ordine dei membri di una struttura. Ad esempio, come hack, spesso le persone lanciano un puntatore a una struttura come il tipo di un determinato campo all'interno del quale desiderano accedere, quindi usano l'aritmetica del puntatore per arrivarci. Per me questa è un'idea piuttosto pericolosa, ma l'ho vista usata, specialmente in C ++ per forzare una variabile che è stata dichiarata privata per essere accessibile pubblicamente quando è in una classe da una libreria di terze parti e non è incapsulata pubblicamente. Il riordino dei membri lo spezzerebbe totalmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top