Perché le strutture impacchettate non fanno parte del linguaggio C?

8

Ogni compilatore C offre l'opzione di "impacchettare" strutture C (ad esempio __attribute__ ((__packed__)) o #pragma pack() ). Ora sappiamo tutti che è necessario l'imballaggio, se vogliamo inviare o archiviare i dati in modo affidabile. Questo deve essere anche un requisito dai primi giorni del linguaggio C.

Quindi mi chiedo perché le strutture impacchettate non facciano parte delle specifiche del linguaggio C? Non sono nemmeno in C99 o C11 anche se la necessità di averli è conosciuta ormai da decenni? Cosa mi manca? Perché è specifico del compilatore?

    
posta grasbueschel 16.08.2014 - 09:34
fonte

3 risposte

7

Suppongo che dipenda dalla combinazione della CPU di destinazione / del compilatore usato. Ciò significa che è meglio essere una direttiva del compilatore (in quanto correlata a quella) di un aspetto linguistico, perché come specificarlo? L'unico modo in cui potrebbero farlo è con l'unione.

L'articolo di Raymond fornisce alcune informazioni sul perché questo è: link

    
risposta data 16.08.2014 - 10:45
fonte
5

Ci sono tre fattori principali.

  1. Alcuni processori non possono accedere a dati non allineati (ad esempio un numero intero o un valore float che inizia su un indirizzo dispari). Il tentativo di fare innesca un'eccezione.
  2. Alcuni processori possono accedere a dati non allineati, ma a un costo prestazionale.
  3. La maggior parte delle strutture è accessibile da un singolo set di codice sorgente C / C ++ e l'interoperabilità con altre lingue è l'eccezione, non la regola.

Tenendo a mente questi fattori, sia i compilatori standard che tutti i compilatori C / C ++ eseguono il routinly delle strutture per garantire l'allineamento ottimale per il processore, ma forniscono anche dei meccanismi per sovrascriverlo se necessario ai fini dell'interop.

Questo non è affatto qualcosa che è stato trascurato. È estremamente ben compreso e la situazione attuale è di progettazione. Le ultime versioni dello standard C ++ hanno un ampio supporto per la gestione dei problemi di allineamento, che forse non hai familiarità con.

    
risposta data 16.08.2014 - 13:55
fonte
0

È specifico del compilatore perché non è nello standard. E non è nello standard perché sarebbe difficile da specificare in un modo che non richiederebbe molto sforzo di implementazione per i compilatori di piattaforme oscure con restrizioni di allineamento forzate.

E nessuno di questi sforzi ha molte giustificazioni, perché ogni compilatore / piattaforma a cui tutti coloro che usano un C89 o un compilatore più recente si preoccupa già lo ha implementato.

    
risposta data 16.08.2014 - 11:11
fonte

Leggi altre domande sui tag