Pergunta

Sistemas exigir que certos primitivos estar alinhado com certos pontos dentro da memória (ints de bytes que são múltiplos de 4, shorts para bytes que são múltiplos de 2, etc.). Naturalmente, estes podem ser otimizados para desperdiçar o mínimo espaço no estofamento.

A minha pergunta é por que não GCC fazer isso automaticamente? É a mais óbvias heurísticos (variáveis ??de ordem de maior requisito de tamanho para o menor) falta de alguma maneira? É algum código dependente da ordem física de suas estruturas (que é uma boa idéia)?

Eu só estou perguntando porque GCC é super otimizada em uma série de maneiras, mas não em um presente, e eu estou pensando que deve haver alguma explicação relativamente fresco (ao qual sou alheio).

Foi útil?

Solução

gcc não reordenar os elementos de um struct, porque isso violaria a norma C. Seção 6.7.2.1 dos estados padrão C99:

Dentro de um objecto de estrutura, a não fi-bit- eld membros e as unidades nas quais campos de bits residem têm endereços que o aumento na ordem em que elas são declaradas.

Outras dicas

Structs são freqüentemente usados ??como representações da ordem de embalagem de formatos de arquivos binários e protocolos de rede. Isso iria quebrar se isso fosse feito. Além disso, diferentes compiladores seria otimizar as coisas de forma diferente e ligando código em conjunto de ambos seria impossível. Isso simplesmente não é viável.

GCC é mais esperto do que a maioria de nós na produção de código de máquina de nosso código fonte; no entanto, eu tremo se era mais esperto do que nós em re-organizar nossas estruturas, uma vez que é dados que por exemplo podem ser gravados em um arquivo. A estrutura que começa com 4 caracteres e, em seguida, tem um inteiro de 4 byte seria inútil se ler em outro sistema, onde GCC decidiu que ele deve re-organizar os membros da estrutura.

gcc SVN tem uma otimização da estrutura de reorganização (-fipa-struct-reorg), mas requer uma análise de todo o programa e não é muito poderoso no momento.

compiladores

C não embalar automaticamente estruturas precisamente porque de problemas de alinhamento como você menciona. não acessa em limites de palavra (32 bits em mais CPUs) carregam pesada multa em x86 e causa armadilhas fatais em arquiteturas RISC.

Não estou dizendo que é uma boa idéia, mas você pode código certamente gravação que depende da ordem dos membros de uma struct. Por exemplo, como um hack, muitas vezes as pessoas lançar um ponteiro para um struct como o tipo de uma determinada dentro do campo que eles querem ter acesso a, em seguida, usar a aritmética de ponteiro para chegar lá. Para mim, isso é uma idéia muito perigoso, mas eu já vi isso usado, especialmente em C ++ para forçar uma variável que foi declarada privada para ser acessível ao público quando está em uma classe a partir de uma biblioteca parte 3 e não é encapsulado publicamente. Reordenar os membros seria totalmente quebrar isso.

Você pode querer experimentar o tronco gcc mais recente ou, struct-reorg-ramo que está em desenvolvimento ativo.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top