동일한 데이터 유형의 비트 필드가 믹스 데이터 유형의 비트 필드에 비해 크기가 적은 이유

StackOverflow https://stackoverflow.com/questions/629141

  •  08-07-2019
  •  | 
  •  

문제

동일한 데이터 유형의 비트 필드가 혼합 데이터 유형보다 크기가 적은 이유를 알고 싶습니다.

struct xyz 
{ 
  int x : 1; 
  int y : 1; 
  int z : 1; 
}; 


struct abc 
{ 
  char x : 1; 
  int y : 1; 
  bool z : 1; 
}; 

크기 (xyz) = 4 sizeof (ABC) = 12.

VS 2005, 64 비트 X86 머신을 사용하고 있습니다.

약간의 기계/컴파일러 레벨 답변이 좋을 것입니다.

도움이 되었습니까?

해결책

조정.

컴파일러는 아키텍처에 적합한 방식으로 변수를 정렬합니다. 당신의 경우, char, int, 그리고 bool 크기가 다르므로 비트 필드 힌트보다는 해당 정보에 따라 다릅니다.

몇 가지 토론이있었습니다 이 질문 이 문제에.

해결책은주는 것입니다 #pragma 지침 또는 __attributes__ 컴파일러에게 정렬 최적화를 무시하도록 지시합니다.

다른 팁

C Standard (1999 버전, §6.7.2.1, 102 페이지, 포인트 10)는 다음과 같이 말합니다.

구현은 비트 필드를 보유 할만 큼 큰 주소가 가능한 저장 장치를 할당 할 수 있습니다. 충분한 공간이 남아있는 경우, 구조물의 다른 비트 필드를 즉시 따르는 비트 필드는 동일한 장치의 인접한 비트로 포장되어야합니다.

포장이 필드의 유형에 의해 영향을받을 수있는 문구가없는 것 같습니다. 따라서 나는 이것이 컴파일러 버그라고 결론을 내릴 것이다.

GCC는 Linux에서 32 비트 및 64 비트 기계 모두에서 4 바이트 구조물을 만듭니다. 나는 VS가없고 그것을 테스트 할 수 없습니다.

Complier 버그 또는 일부 코드 오류입니다. 구조에 할당 된 모든 비트는 항상 가장 높은 데이터 유형의 크기를 정의하려고합니다. 예를 들어 가장 높은 데이터 유형의 구조 XYZ 크기에서는 4의 IE입니다. 두 번째 구조에 대해 유사한 방식으로 ABC 가장 높은 데이터 유형 크기는 int의 경우 4입니다.

마치 구조의 변수를 다음과 같이 변경하는 것처럼 다음과 같은 경우 : struct abc {char a : 1; 숯 B : 1; bool c : 1; };

크기 (ABC)는 1이 아닌 4가됩니다. 가장 높은 데이터 유형은 1이기 때문에 모든 비트는 14 숯에 맞습니다.

구조의 데이터 유형을 변경하여 다양한 테스트를 수행 할 수 있습니다.

오래된 구조를 기반으로 한 출력 링크 : 방문 http://codepad.org/6j5z2cex

나에 의해 정의 된 위 구조를 기반으로 한 출력 링크 : 방문 http://codepad.org/fqf9ob8w

구조물의 크기에 대한 이러한 문제를 피하기 위해 #Pragma Pack 매크로를 사용하여 구조물을 올바르게 포장해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top