Melhor resposta
A sequência exata sizeof(struct)
é um erro de compilação em C. Presumo que você esteja perguntando como determina o tamanho de um particular struct
.
Essa resposta não é fornecida pela definição da linguagem C diretamente. Em vez disso, é uma função da ABI para sua arquitetura de destino específica. (ABI significa Application Binary Interface.)
O padrão da linguagem C estabelece algumas regras gerais. Por exemplo, se você tiver um struct
com vários membros, o primeiro membro compartilhará um endereço com o próprio struct
, e os membros subsequentes irão estar em endereços superiores.
Bitfields têm seu próprio conjunto de regras. Não vou recapitulá-los aqui.
Para uma primeira ordem, o tamanho de um struct
será pelo menos tão grande quanto a soma do tamanho de seus membros (ignorando os campos de bits por enquanto). Os membros podem ter restrições de alinhamento e, se tiverem, o ambiente pode introduzir preenchimento entre os membros e preenchimento no final do struct
.
Considere o seguinte struct
em uma arquitetura que requer alinhamento de 8 bytes para double
valores:
struct fun {
char a;
double b;
char c;
};
Pelas regras da linguagem C, b
deve estar em um endereço superior a a
em qualquer instância de struct fun
. Da mesma forma, c
deve estar em um endereço superior a b
.
Como resultado, esta estrutura particular provavelmente ocupa 24 bytes, devido às restrições de alinhamento em b
nessa arquitetura. A mesma estrutura pode exigir apenas 16 bytes em uma arquitetura que requer apenas alinhamento de 4 bytes para double
.
Não acredita em mim?
Veja você mesmo:
Por fim, você precisa consultar a ABI de sua plataforma de destino para entender como um struct
é compactado para esse destino.
Ou apenas use sizeof
se você pessoalmente não se importa, mas seu código precisa se preocupar.
Resposta
Como faço para calcular o valor de sizeof (struct) em C?
Você não. O compilador sim.
Primeiro, sizeof(struct)
é um erro de sintaxe. Você provavelmente está se perguntando como determinar o tamanho de um tipo de estrutura ou de um objeto desse tipo. É importante ser preciso. (Eu entendo que a remoção dos detalhes das perguntas pelo Quora torna isso difícil.)
Digamos que você tenha um tipo de estrutura chamado struct foo
e / ou um objeto desse tipo chamado obj
. O tamanho do tipo é sizeof (struct foo)
e o tamanho do objeto (que é igual ao tamanho de seu tipo) é sizeof foo
. (Os parênteses são necessários no primeiro caso e não no segundo. Na verdade, existem duas formas diferentes do operador sizeof
. Um é aplicado a um nome de tipo entre parênteses, o outro a expressão, que geralmente é, mas nem sempre, um nome de objeto.)
Você pode estar pensando que pode calcular o tamanho de uma estrutura somando os tamanhos de seus membros. Você não pode. Os compiladores podem inserir preenchimento entre os membros e, possivelmente, após o último membro, para satisfazer os requisitos de alinhamento. O tamanho de uma estrutura é pelo menos a soma dos tamanhos de seus membros, mas se você precisar do tamanho de toda a estrutura, basta usar sizeof
. É para isso que serve.