Uso Eficiente de Memória com Bit Fields em C
Suponha que seu programa C contenha várias variáveis VERDADEIRO/FALSO agrupadas em uma estrutura chamada status, da seguinte forma:
struct {
unsigned int larguraValidada;
unsigned int alturaValidada;
} status;
Esta estrutura requer 8 bytes de espaço de memória, mas na verdade, vamos armazenar apenas 0 ou 1 em cada uma das variáveis. A linguagem de programação C oferece uma maneira melhor de utilizar o espaço de memória em tais situações.
Se você estiver usando tais variáveis dentro de uma estrutura, pode definir a largura de uma variável, o que diz ao compilador C que você vai usar apenas aqueles números de bytes. Por exemplo, a estrutura acima pode ser reescrita da seguinte forma:
struct {
unsigned int larguraValidada : 1;
unsigned int alturaValidada : 1;
} status;
A estrutura acima requer 4 bytes de espaço de memória para a variável status, mas apenas 2 bits serão usados para armazenar os valores.
Se você usar até 32 variáveis, cada uma com largura de 1 bit, a estrutura status ainda usará 4 bytes. No entanto, assim que você tiver 33 variáveis, ela alocará o próximo slot de memória e começará a usar 8 bytes. Vamos verificar o exemplo a seguir para entender o conceito:
#include <stdio.h>
#include <string.h>
/* define estrutura simples */
struct {
unsigned int larguraValidada;
unsigned int alturaValidada;
} status1;
/* define estrutura com bit fields */
struct {
unsigned int larguraValidada : 1;
unsigned int alturaValidada : 1;
} status2;
int main() {
printf("Tamanho de memória ocupado por status1: %d\n", sizeof(status1));
printf("Tamanho de memória ocupado por status2: %d\n", sizeof(status2));
return 0;
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Tamanho de memória ocupado por status1: 8 Tamanho de memória ocupado por status2: 4
Declaração de Bit Field
A declaração de um bit-field tem a seguinte forma dentro de uma estrutura:
struct {
tipo [nome_membro] : largura;
};
A tabela a seguir descreve os elementos variáveis de um bit field:
| Nº | Elemento e Descrição |
|---|---|
| 1 | tipo Um tipo inteiro que determina como o valor de um bit-field é interpretado. O tipo pode ser int, signed int ou unsigned int. |
| 2 | nome_membro O nome do bit-field. |
| 3 | largura O número de bits no bit-field. A largura deve ser menor ou igual à largura de bits do tipo especificado. |
As variáveis definidas com uma largura predefinida são chamadas de bit fields. Um bit field pode conter mais de um único bit; por exemplo, se você precisar de uma variável para armazenar um valor de 0 a 7, pode definir um bit field com largura de 3 bits da seguinte forma:
struct {
unsigned int idade : 3;
} Idade;
A definição de estrutura acima instrui o compilador C que a variável idade vai usar apenas 3 bits para armazenar o valor. Se você tentar usar mais de 3 bits, não será permitido. Vamos tentar o seguinte exemplo:
#include <stdio.h>
#include <string.h>
struct {
unsigned int idade : 3;
} Idade;
int main() {
Idade.idade = 4;
printf("Sizeof(Idade): %d\n", sizeof(Idade));
printf("Idade.idade: %d\n", Idade.idade);
Idade.idade = 7;
printf("Idade.idade: %d\n", Idade.idade);
Idade.idade = 8;
printf("Idade.idade: %d\n", Idade.idade);
return 0;
}
Quando o código acima é compilado, ele compilará com um aviso e, quando executado, produz o seguinte resultado:
Sizeof(Idade): 4 Idade.idade: 4 Idade.idade: 7 Idade.idade: 0
Linguagem C
- Dominando Operadores Bitwise e Bit Shift em C#: Guia Abrangente
- Quatro Padrões Comprovados para Funções Definidas pelo Usuário em C
- Como Passar Arrays 1D e 2D para Funções em C – Um Guia Prático
- Dominando Structs e Ponteiros em C: Guia Prático
- Palavra-chave this em Java: Usos Práticos, Construtores e Mais
- Dominando Encapsulamento em Java: Guia Prático de Ocultação de Dados
- Structs em C++ Explicadas com Exemplo Prático
- Dominando Funções em C: Estrutura, Declaração e Boas Práticas
- Dominando Argumentos Variáveis em C: Guia Prático
- Integração no MATLAB: De Antiderivadas a Somas de Riemann