- Back to Home »
- C »
- C - Bit Fields
Monday, April 27, 2015
Bit Fields là một kỹ thuật nhằm tối ưu bộ nhớ trong struct, trong một số trường hợp khi khai báo ta sử dụng kiểu dữ liệu có phạm vi giá trị lớn, trong khi giá trị thực tế nhỏ hơn và không bao giờ đạt đến những giá trị lớn đó.
Khai báo:
struct
{
type [member_name] : width ;
};
trong đó
Elements | Description |
---|---|
type | Kiểu int, signed int hoặc unsigned int |
member_name | Tên của bit-fields |
width | số bít sử dụng, nhỏ hơn hoặc bằng số bít của kiểu dữ liệu type |
Ex:
struct
{
unsigned int age; /* 0 <= age <= (2^32 - 1) */
} Age;
Như khai báo trên thấy rằng Age được cấp phát 4bytes, giá trị mà nó nhận được trong khoảng
0 <= Age.age <= (2^32 -1), con số (2^32 -1) thực sự vô cùng lớn, trong khi đó giá trị thực tế nhỏ hơn nhiều. Giả sử 0 <= Age.age <=7, theo đó có khai báo sau sẽ giúp tiết kiệm bộ nhớ hơn.
struct
{
unsigned int age : 3; /* 0 <= age <= (2^3 - 1 = 7) */
} Age;
Nếu Age.age được gán giá trị lớn hơn 7 thì sẽ được gán lại theo phép chia lấy phần dư cho 2^3
Age.age = Age.age / 2^3
bitfield.c
#include <stdio.h>
#include <string.h>
struct
{
unsigned int age; /* 0 <= age <= (2^32 - 1) */
} AgeLarger;
struct
{
unsigned int age : 3; /* 0 <= age <= (2^3 - 1) */
} Age;
int main( )
{
printf( "Sizeof( AgeLarger ) : %d\n", sizeof(AgeLarger) );
printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
Age.age = 4;
printf( "Age.age : %d\n", Age.age );
Age.age = 7;
printf( "Age.age : %d\n", Age.age );
Age.age = 8;
printf( "Age.age : %d\n", Age.age );
return 0;
}
Compile & Execute:
$ gcc bitfields.c
bitfields.c: In function ‘main’:
bitfields.c:26:5: warning: large integer implicitly truncated to unsigned type [-Woverflow]
Age.age = 8;
^
$ ./a.out
Sizeof( AgeLarger ) : 4
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
This comment has been removed by the author.
ReplyDeleteI must admit that I didn't know much about bit fields prior to coming across this site. I'm happy that I have learnt this technique of optimizing memory in the struct through this post. Check out this link: Case Study Proofing Service
ReplyDelete