Todo compilador C oferece a opção de "empacotar" estruturas C (por exemplo __attribute__ ((__packed__))
, ou #pragma pack()
). Agora, todos sabemos que a embalagem é necessária, se quisermos enviar ou armazenar dados de maneira confiável. Isso também deve ter sido um requisito desde os primeiros dias da linguagem C.
Então, eu me pergunto por que estruturas compactadas não fazem parte da especificação da linguagem C? Eles não estão nem no C99 nem no C11, embora a necessidade de tê-los seja conhecida há décadas? O que estou perdendo? Por que é específico do compilador?
Respostas:
Eu acho que é porque depende da combinação do CPU / compilador de destino usado. Isso significa que é melhor ser uma diretiva de compilador (relacionada a isso) do que um aspecto da linguagem, porque como especificar isso? A única maneira de fazê-lo é com a união.
O artigo de Raymond fornece algumas dicas sobre por que isso é: http://www.catb.org/esr/structure-packing/
fonte
Existem três fatores principais.
Com esses fatores em mente, o compilador padrão e todos os compiladores C / C ++ rotineiramente protegem as estruturas para garantir o alinhamento ideal do processador, mas também fornecem mecanismos para substituí-lo, se necessário, para fins de interoperabilidade.
Isso não é de modo algum algo que foi esquecido. É extremamente bem compreendido e a situação atual é planejada. As versões mais recentes do padrão C ++ têm amplo suporte para lidar com problemas de alinhamento, dos quais talvez você não esteja familiarizado.
fonte
É específico do compilador porque não está no padrão. E isso não está no padrão, porque seria difícil especificar de uma maneira que não exigiria muito esforço de implementação para compiladores de plataformas obscuras com restrições de alinhamento impostas.
E nenhum desses esforços tem muita justificativa, porque todo compilador / plataforma que qualquer pessoa que utilize um compilador C89 ou posterior se preocupa já o implementou.
fonte
&
/ necessárias|
para ler / gravar os valores de cada campo.