2010-06-21 2 views
9

공용 영역에서 비트 필드를 사용할 수 있습니까?c 공용체 및 비트 필드

+12

이 악한 일을, 그들은 합이나 곱합니까? ;-) –

+0

+1 to Amardeep. do not do 그리고 divya. –

+0

더 가까운 비트 필드와 노조는 악조적이어야합니다. 저는 유니온 구조체를 사용하여 임베디드 소프트웨어에서 바이트 입/출력을 구문 분석합니다. 그 위안은 그 단점을 극복합니다. – schmijos

답변

2

네, 가능하지만 반대하는 것이 좋습니다. 비트 필드의 길이와 패킹은 이식 가능하지 않습니다. 노동 조합의 규모는 예측하기가 어렵습니다 (here 참조). 유니언이나 비트 필드를 사용할 때 코드에 도입하는 데 어느 정도 복잡합니다. 이 복잡성은 코드에서 수용 가능하지만 두 코드를 결합하면 수용 할 수없는 복잡성이 발생할 수 있습니다. 공용체, 구조체 및 비트 필드를 사용하는 경우 메모리 정렬 문제가 발생합니다.

이 코드가 하나의 시스템에서만 작성되고 실행되어야하는 쓰레기 수있는 코드라면, 아마도 괜찮을 것입니다. 그러나 이것을 영원히 살 수있는 버전 관리로 확인하는 경우에는 반대하는 것이 좋습니다.

당신이 이것을하고 싶은 이유의 예를 들면, 나 또는 다른 누군가가 더 나은 대안을 제안 할 수 있습니다.

편집 : 의견을 바탕으로 명확히하고 피드백을 요청하십시오.

+3

일반적으로 비트 필드와 비교할 때 유니온의 비트 필드에 대해 이식성이 떨어지는 것은 무엇입니까? 구체적으로 예측하기 어려운 것은 무엇입니까? – AnT

+3

링크 된 게시물의 불만 사항은 동작이 아닌 bitfield가 포함 된 unitof sizeof()에 대한 것입니다. 구조체 크기는 항상 구현에 따라 다르며 비트 필드와 관련이 없습니다. 비트 필드 멤버의 주소를 알 수 없다는 것에 대한 불만이 있었지만 비트 필드가 작동하고 노조와 아무런 관련이없는 것입니다. – Alan

+0

덜 막연합니다. 일반적으로 저는 마이크로 컨트롤러 용 펌웨어에서 작업하기 때문에 크기/메모리 정렬에 대해 과민 반응을 보입니다. 정렬되지 않은 구조체 또는 변수는 성능에 영향을 미치고 비 원자 적로드 및 저장을 초래할 수 있습니다. 귀하의 마일리지가 다를 수 있습니다. –

8

예, 가능합니다. 왜 안돼? 공용체의 비트 필드는 다른 곳에서 동작하는 것과 같은 방식으로 동작합니다. 노조 (또는 비트 필드가있는 유니온)의 비트 필드에는 특별한 것이 없습니다.

0

하나의 공용체 요소에 쓰고 다른 요소에서 읽는 경우에만 안전하지 않습니다. 구현의 세부 사항이 발생하지 않는다면, bitfied (그리고 아마도 다른 멤버들)를 포함하고있는 union은 잘 정의 된 안전한 행동을합니다.

+0

노동 조합 유형의 실행 구현이 정의되어 있지 않습니까? – detly

+1

이것은 C++이 아닙니다. 유니온을 통한 타입 페닝은 C에서 완벽하게 유효하며 C++의 reinterpret_cast와 비슷한 방식으로 작동합니다. Technical Corrigendum 3에서는이를 명확하게 설명합니다. –

2

노조가 어떻게 작동하는지 생각해 보면 답을 얻을 수 있습니다. 그렇습니다. 물론 그렇습니다. 왜 그렇습니까? 우리가 예상했듯이 노동 조합은 가장 큰 데이텀을 유지하기에 충분히 크므로 자동으로 작습니다. 비트 필드는 "컨테이너"로 압축되며 컴파일러는 최종 실제 크기를 평가할 수 있어야합니다. 다음은 몇 가지 흥미로운 사실을 보여줍니다 (물론 아닌 비트 필드의 존재, 노동 조합의 잘못된 사용입니다!)

#include <stdio.h> 

union test { 
    int a:5; 
    int b:12; 
    float c; 
    double d; 
    int x; 
}; 

int main() 
{ 
    union test x; 
    printf("%d\n", sizeof(x)); 
    x.a = 31; 
    printf("%d\n", x.a); 
    printf("%d\n", x.b); 
    x.c = 1.23; 
    printf("%d\n", x.a); 
    printf("%f\n", x.c); 
    x.x = 31; 
    printf("%d\n", x.x); 
    printf("%d\n", x.a); 
    printf("%d\n", x.b); 
} 
관련 문제