Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Compreendendo o Layout de Memória de Structs | Compreendendo Structs e Memória
Dominando Structs em C

bookCompreendendo o Layout de Memória de Structs

Estruturas de memória na linguagem de programação C desempenham um papel fundamental na compreensão de como os dados são armazenados e acessados na memória. Quando uma estrutura é definida em C, o compilador determina como posicionar seus membros na memória com base nas regras de alinhamento e preenchimento.

A seguir, uma visão geral de como a alocação básica de memória para estruturas funciona em C:

main.c

main.c

copy
123456789101112131415
#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }

Como esperado, tal estrutura deveria ocupar 5 bytes: 1 byte para char x, 4 bytes para int y, mas isso será 8 bytes.

Por que o tamanho da estrutura é muito maior do que esperávamos?

Isso ocorre porque o compilador pode inserir preenchimento entre os membros para garantir que cada membro comece em um endereço que seja múltiplo do seu tamanho.

Na imagem, é possível ver que a primeira parte da memória (seção mais clara) pertence à variável char x, que ocupa apenas um byte. Após isso, há três bytes vazios — este é o preenchimento, adicionado automaticamente pelo compilador para garantir que o próximo elemento comece no endereço correto. Após o preenchimento, a variável int y é armazenada, ocupando quatro bytes.

Como resultado, a estrutura ocupa um total de oito bytes: um para o char, três para alinhamento e quatro para o int.

Esse layout existe para ajudar o processador a acessar os dados de forma mais eficiente. Sem alinhamento, o acesso aos membros da estrutura seria mais lento e o programa teria desempenho inferior.

question mark

Por que sizeof(struct Test) retorna 8 em vez de 5?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 1

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

Can you explain more about alignment and why it's necessary?

Are there ways to reduce the size of a structure in C?

How does padding affect performance in real-world programs?

bookCompreendendo o Layout de Memória de Structs

Deslize para mostrar o menu

Estruturas de memória na linguagem de programação C desempenham um papel fundamental na compreensão de como os dados são armazenados e acessados na memória. Quando uma estrutura é definida em C, o compilador determina como posicionar seus membros na memória com base nas regras de alinhamento e preenchimento.

A seguir, uma visão geral de como a alocação básica de memória para estruturas funciona em C:

main.c

main.c

copy
123456789101112131415
#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }

Como esperado, tal estrutura deveria ocupar 5 bytes: 1 byte para char x, 4 bytes para int y, mas isso será 8 bytes.

Por que o tamanho da estrutura é muito maior do que esperávamos?

Isso ocorre porque o compilador pode inserir preenchimento entre os membros para garantir que cada membro comece em um endereço que seja múltiplo do seu tamanho.

Na imagem, é possível ver que a primeira parte da memória (seção mais clara) pertence à variável char x, que ocupa apenas um byte. Após isso, há três bytes vazios — este é o preenchimento, adicionado automaticamente pelo compilador para garantir que o próximo elemento comece no endereço correto. Após o preenchimento, a variável int y é armazenada, ocupando quatro bytes.

Como resultado, a estrutura ocupa um total de oito bytes: um para o char, três para alinhamento e quatro para o int.

Esse layout existe para ajudar o processador a acessar os dados de forma mais eficiente. Sem alinhamento, o acesso aos membros da estrutura seria mais lento e o programa teria desempenho inferior.

question mark

Por que sizeof(struct Test) retorna 8 em vez de 5?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 1
some-alt