Como calcular o valor de sizeof (struct) em C


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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *