Por que os compiladores C não podem reorganizar os membros da estrutura para eliminar o preenchimento do alinhamento? [duplicado

Possible Duplicate:
Por que o GCC não otimiza estruturas?
Por que o C ++ não torna a estrutura mais rígid

Considere o seguinte exemplo em uma máquina x86 de 32 bits:

Devido a restrições de alinhamento, a seguinte estrutura

struct s1 {
    char a;
    int b;
    char c;
    char d;
    char e;
}

pode ser representado com mais eficiência de memória (12 x 8 bytes) se os membros forem reordenados como em

struct s2 {
    int b;
    char a;
    char c;
    char d;
    char e;
}

Eu sei que os compiladores C / C ++ não têm permissão para fazer isso. Minha pergunta é por que a linguagem foi projetada dessa maneira. Afinal, podemos acabar desperdiçando grandes quantidades de memória e referências comostruct_ref->b não se importaria com a diferença.

EDITA: Obrigado a todos por suas respostas extremamente úteis. Você explica muito bem por que a reorganização não funciona devido à maneira como o idioma foi projetado. No entanto, isso me faz pensar: esses argumentos ainda seriam válidos se o rearranjo fizesse parte da linguagem? Digamos que houvesse alguma regra de rearranjo especificada, da qual exigimos pelo menos que

ó devemos reorganizar a estrutura se realmente necessário (não faça nada se a estrutura já estiver "restrita" a regra olha apenas para a definição da estrutura, não dentro das estruturas internas. Isso garante que um tipo de estrutura tenha o mesmo layout, seja interno ou não em outra estrutura layout de memória compilada de uma determinada estrutura é previsível, dada sua definição (ou seja, a regra é fix

Como abordar seus argumentos, um por um, eu raciocino:

Mapeamento de dados de baixo nível, "elemento de menor surpresa": Escreva suas estruturas em um estilo restrito (como na resposta de @ Perry) e nada mudou (requisito 1). Se, por algum motivo estranho, você desejar que o preenchimento interno esteja lá, insira-o manualmente usando variáveis fictícias e / ou poderá haver palavras-chave / diretivas.

iferenças do compilad: O requisito 3 elimina essa preocupação. Na verdade, pelos comentários de @David Heffernan, parece que hoje temos esse problema porque diferentes compiladores funcionam de maneira diferente?

Otimizaçã: O ponto principal de reordenar é a otimização (memória). Eu vejo muito potencial aqui. Talvez não consigamos remover o preenchimento juntos, mas não vejo como a reordenação poderia limitar a otimização de alguma forma.

Type fundição: Parece-me que este é o maior problema. Ainda assim, deve haver maneiras de contornar isso. Como as regras são fixadas no idioma, o compilador é capaz de descobrir como os membros foram reordenados e reagir de acordo. Como mencionado acima, sempre será possível impedir a reordenação nos casos em que você deseja controle completo. Além disso, o requisito 2 garante que o código de segurança nunca seja quebrad

A razão pela qual acho que essa regra pode fazer sentido é porque acho mais natural agrupar os membros da estrutura por seus conteúdos do que por seus tipos. Também é mais fácil para o compilador escolher a melhor ordem do que para mim quando tenho muitas estruturas internas. O layout ideal pode até ser um que não posso expressar de maneira segura. Por outro lado, parece tornar a linguagem mais complicada, o que é obviamente uma desvantage

Observe que não estou falando sobre alterar o idioma - apenas se ele pudesse (/ deveria) ter sido projetado de forma diferent

ei que minha pergunta é hipotética, mas acho que a discussão fornece uma visão mais profunda dos níveis mais baixos da máquina e do design da linguage

Sou bastante novo aqui, então não sei se devo gerar uma nova pergunta para isso. Por favor, diga-me se for esse o cas

questionAnswers(22)

yourAnswerToTheQuestion