을하더라도 ANSI C 표준은 "컴파일러가 적합하다고 생각하는 비트 필드를 패키징 할 수 있지만"많은 경우 컴파일러가 가장 효율적인 방식으로 항목을 패키징하는 것을 금지합니다.
특히, 구조체에 비트 필드가 포함되어있는 경우 컴파일러는 하나 이상의 익명 필드를 포함하는 구조로 저장 한 다음 이러한 각 필드를 구성 비트 필드 부분으로 논리적으로 세분화해야합니다. 따라서, 주어진 : unsigned char
는 8 비트입니다
unsigned char foo1: 3;
unsigned char foo2: 3;
unsigned char foo3: 3;
unsigned char foo4: 3;
unsigned char foo5: 3;
unsigned char foo6: 3;
unsigned char foo7: 3;
경우, 컴파일러는 해당 유형의 네 개의 필드를 할당하고 제외한 모든 두 개의 비트 필드를 지정해야 할 것이다 (이 자신의 char
필드에있을 것입니다) . 모든 char
선언이 short
으로 대체 된 경우 short
유형의 두 필드가 있으며 그 중 하나는 5 비트 필드를 보유하고 다른 하나는 나머지 2를 보유합니다.
정렬 제한이없는 프로세서의 경우 첫 번째 5 개 필드는 unsigned short
, 마지막 두 개 필드는 unsigned char
을 사용하여 7 개의 3 비트 필드를 3 바이트로 저장함으로써 데이터를보다 효율적으로 배치 할 수 있습니다. 8 바이트 3 바이트 필드를 3 바이트로 저장할 수 있어야하지만 컴파일러는 "외부 필드"유형으로 사용할 수있는 3 바이트 숫자 유형이있는 경우에만이를 허용 할 수 있습니다.
기본적으로 개인적으로 정의 된 비트 필드는 기본적으로 쓸모가 없다고 생각합니다. 바이너리 팩 된 데이터로 코드를 처리해야하는 경우 실제 유형의 저장 위치를 명시 적으로 정의한 다음 매크로 또는 비트를 액세스하는 다른 수단을 사용해야합니다. C는 같은 구문을 지원하는 경우 도움이 될 것입니다 :
unsigned short f1;
unsigned char f2;
union foo1 = f1:0.3;
union foo2 = f1:3.3;
union foo3 = f1:6.3;
union foo4 = f1:9.3;
union foo5 = f1:12.3;
union foo6 = f2:0.3;
union foo7 = f2:3.3;
코드 워드 크기 나 바이트 순서 부에 관계없이, 휴대용 방식으로 비트 필드를 사용하는 구문이 허용하는 경우, 그것을 가능하게하는 것 같은 (foo0을 것 f1의 3 개의 최하위 비트에 있지만, 하위 주소 나 상위 주소에 저장 될 수 있습니다). 그러나 이러한 기능이 없으면 매크로가 이러한 기능을 수행하는 유일한 휴대용 방법 일 수 있습니다.
아마 정렬 최적화 일 것입니다. 다음 비트 크기가 실제 점유 공간에 맞지 않으면 새로운 바이트를 시작합니다. –
비트 패킹이 필요한 외부 제약 조건이 없거나 플랫폼이 표준이 제공하는 것보다 몇 가지 추가 보장을 제공하지 않는 한 비트 필드를 사용하는 것이 거의 없습니다. –
C의 경우 char을 사용하면 int를 사용하는 것보다 이식성이 떨어집니다 (http://stackoverflow.com/a/23987436/23118). – hlovdal