Características de uma variável
Os campos de bits são usados para consumir a memória com eficiência de forma que gerenciemos nosso espaço de memória de uma maneira suave.
Pode ser usado em estrutura e união também.
Como implementar um campo Bit no programa C
1 2 3 4 5 6 7 8 9 10 11 | data data não assinado int d; não assinado int m; não assinado int y; ; |
Explicação
A variável do tipo, "Date", pega 12 bytes em um compilador, que são 32 bits em um compilador de 64 bits, enquanto "data" pega 6 bytes em um compilador que são 16 bits.
64 bits
D1 | ||
d | m | y |
22 | 1 | 2016 |
4 bytes | 4 bytes | 4 bytes |
= 12 bytes |
32 bits
D1 | ||
d | m | y |
22 | 1 | 2016 |
2 bytes | 2 bytes | 2 bytes |
= 6 bytes |
Como reduzir o tamanho de uma variável em um programa
Exemplo de programação 1
Neste exemplo de programação, veremos qual quantidade de memória é consumida por qualquer tipo de variável.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #incluir Data de estrutura // Definindo o tipo de dados definido pelo usuário. não assinado int d; // Membro de dados do tipo de dados de data. não assinado int m; não assinado em t y; ; int main () data data d1 = 22, 1, 2016; // A variável do tipo de data é declarada e inicializada. printf ("tamanho de d1 é %d", sizeof (d1)); retornar 0; |
Saída
Explicação
Os valores da data e mês são fixos: a data é 31 e o mês é 12.
2 | 31 |
2 | 15-2 |
2 | 7-1 |
2 | 3-1 |
1-1 | |
2 | 12 |
2 | 6-0 |
2 | 3-0 |
1-1 | |
11111 1100 | 1100 |
(5 bits) | (4 bits) |
A partir do cálculo anterior da data, estamos tentando dizer que, para representar um dia máximo em um mês (31), apenas 5 bits de memória são necessários em 4 bytes ou 32 bits. É o mesmo também no caso de contagem de meses. Há 12 meses em um ano. Para representar 12 na memória, leva apenas 4 bits em 4 bytes ou 32 bits. Assim, fica claro a partir dessa percepção que o restante da memória é desperdiçado no caso do dia e do mês em uma data. Nesta situação, o campo de bits nos ajuda a resolver o problema.
Exemplo de programação 2
Neste exemplo de programação, usaremos o campo de bits para consumir memória para a variável.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #incluir Data de estrutura // Definindo o tipo de dados definido pelo usuário. não assinado int d: 5; // Membro de dados do tipo de dados de data. não assinado int m: 4; // Usando o campo de bits como cólon: não assinado int y; ; int main () data data d1 = 22, 1, 2016; // A variável do tipo de data é declarada e inicializada. printf ("tamanho de d1 é %d", sizeof (d1)); retornar 0; |
Saída:
Explicação
Sabemos que o valor de D é sempre de 1 a 31. Um ano contém 12 meses. Portanto, o valor de inicialização da variável do mês, M, é um máximo de 12. Podemos lidar com o espaço extra com a ajuda de campos de bits.
Exemplo aprimorado
Bytes de memória única [4 bytes] |
O bloco de memória é criado múltiplo de 4 bytes.
A variável d1 do tipo "data" pega 8 bytes em um compilador, enquanto um número inteiro não assinado pega 4 bytes.
Exemplo de programação 3
Veremos outro exemplo de consumo de memória sem usar um campo de um bit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #incluir estrutura tm não assinado int hrs; não assinado int min; não assinado int sec; ; int main () struct tm t = 11, 30, 10; // Declaração de uma variável de tipo definido pelo usuário. printf ("O tempo é %d: %d: %d \ n", t.hrs, t.hortelã.sec); printf ("O tamanho do relógio = %ld bytes.\ n ", sizeof (struct tm)); retornar 0; |
Saída
Explicação
A partir do cálculo anterior da data, estamos tentando dizer que, para representar o máximo de segundos em uma hora (60), apenas uma memória de 6 bits é necessária em 4 bytes ou 32 bits. É o mesmo também no caso de contar a ata. Há 60 minutos em uma hora. Para representar 60 na memória, leva apenas 5 bits em 4 bytes ou 32 bits. Portanto, fica claro a partir dessa percepção que o restante da memória é desperdiçado no caso do dia e do mês em uma data. Este problema será resolvido com a ajuda do campo de bits.
Exemplo de programação 4
Aqui, podemos ver outra aplicação de campos de bits.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #incluir estrutura tm não assinado int hrs: 8; não assinado int min: 10; não assinado int sec: 10; ; int main () struct tm t = 11, 30, 10; // Declaração de uma variável de tipo definido pelo usuário. printf ("O tempo é %d: %d: %d \ n", t.hrs, t.hortelã.sec); printf ("O tamanho do relógio = %ld bytes.\ n ", sizeof (struct tm)); retornar 0; |
Saída
Explicação
Neste exemplo de programação, usamos o campo de bits para consumir memória. Como vemos no exemplo, usaremos o campo de bits (:) Depois de declarar todos os dados do tipo de dados do tempo, tentando consumir bits em um local de memória. Como resultado, veremos a memória de saída é consumida.
Conclusão
A partir da declaração anterior, é evidente que precisamos usar o campo de bits para gerenciar a complexidade do espaço na linguagem C. Bit Field nos ajuda a remover a alocação de memória desperdiçada extra da memória para gerenciar a complexidade do espaço. Então, devemos usar o campo de bit de uma maneira muito consciente, onde é necessário. Caso contrário, os dados podem ser desperdiçados.