Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

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

  1. Dominando Operadores Bitwise e Bit Shift em C#: Guia Abrangente
  2. Quatro Padrões Comprovados para Funções Definidas pelo Usuário em C
  3. Como Passar Arrays 1D e 2D para Funções em C – Um Guia Prático
  4. Dominando Structs e Ponteiros em C: Guia Prático
  5. Palavra-chave this em Java: Usos Práticos, Construtores e Mais
  6. Dominando Encapsulamento em Java: Guia Prático de Ocultação de Dados
  7. Structs em C++ Explicadas com Exemplo Prático
  8. Dominando Funções em C: Estrutura, Declaração e Boas Práticas
  9. Dominando Argumentos Variáveis em C: Guia Prático
  10. Integração no MATLAB: De Antiderivadas a Somas de Riemann