terça-feira, 7 de dezembro de 2010

Bit field em estruturas C

O C oferece uma forma especial para declarar o tamanho(em bits) dos membros em uma estrutura, conhecido como bit field, é um inteiro com o número de bits especificado. O bit field é declarado com um structure member do tipo int, signet int, unsigned int, ou bool. Você declara o bit file após o nome do membro seguido por ":" e o número de bits que irá ocupar.

O bit field funciona bem para controle, conforme o exemplo abaixo:
#include <stdio.h>
int main(){
    /* Criar a estrutura */
    struct connectionStatus {
        unsigned int  TCP_UDP:1;
        unsigned int  PORT:32;
        unsigned int  OK:1;
    };
    /* Variavies que vão receber os valores */
    struct connectionStatus firstConnection;
    struct connectionStatus secondConnection;
    /* Definir status da primeira Conexão */
    firstConnection.TCP_UDP = 1;
    firstConnection.PORT = 80;
    firstConnection.OK = 1;
    /* Definir status da segunda Conexão */
    secondConnection.TCP_UDP = 0;
    secondConnection.PORT = 5556;
    secondConnection.OK = 0;
    /* Imprimir valores da primeira conexão */
    if (firstConnection.TCP_UDP == 1) { 
        printf("Primeira Conexão...................\n");
        printf("Conexão TCP\n");
        printf("Porta: %d\n", firstConnection.PORT);
        if (firstConnection.OK == 1) {
            printf("Status: Conexão estabelecida !\n"); 
        } else {
            printf("Status: Erro para conectar !\n");   
        }
    }
    /* Imprimir valores da segunda conexão */
    if (secondConnection.TCP_UDP == 0) {
        printf("\nSegunda Conexão...................\n");
        printf("Conexão TCP\n");
        printf("Porta: %d\n", secondConnection.PORT);
        if (secondConnection.OK == 1) {
            printf("Status: Conexão Estabelecida !\n");
        } else {
            printf("Status: Erro para conectar !\n");
        }
    }
};

No exemplo criamos uma estrutura que mostra o status das fictícias conexões, e o bit field foi utilizado para esse fim. Então imagine um cenário onde temos centenas ou milhares de conexões simultâneas e você declarou um int de 32 bits (tamanho padrão desse tipo em um sistema 32bits) para a variável TCP_UDP, você terá um consumo 31 vezes maior de memória por conexão do que se tivesse declarado 1 bit apenas.

Nenhum comentário:

Postar um comentário