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  

{ 2 nhận xét... read them below or Comment }

  1. This comment has been removed by the author.

    ReplyDelete
  2. I 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

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -