공용 영역에서 비트 필드를 사용할 수 있습니까?c 공용체 및 비트 필드
답변
네, 가능하지만 반대하는 것이 좋습니다. 비트 필드의 길이와 패킹은 이식 가능하지 않습니다. 노동 조합의 규모는 예측하기가 어렵습니다 (here 참조). 유니언이나 비트 필드를 사용할 때 코드에 도입하는 데 어느 정도 복잡합니다. 이 복잡성은 코드에서 수용 가능하지만 두 코드를 결합하면 수용 할 수없는 복잡성이 발생할 수 있습니다. 공용체, 구조체 및 비트 필드를 사용하는 경우 메모리 정렬 문제가 발생합니다.
이 코드가 하나의 시스템에서만 작성되고 실행되어야하는 쓰레기 수있는 코드라면, 아마도 괜찮을 것입니다. 그러나 이것을 영원히 살 수있는 버전 관리로 확인하는 경우에는 반대하는 것이 좋습니다.
당신이 이것을하고 싶은 이유의 예를 들면, 나 또는 다른 누군가가 더 나은 대안을 제안 할 수 있습니다.
편집 : 의견을 바탕으로 명확히하고 피드백을 요청하십시오.
일반적으로 비트 필드와 비교할 때 유니온의 비트 필드에 대해 이식성이 떨어지는 것은 무엇입니까? 구체적으로 예측하기 어려운 것은 무엇입니까? – AnT
링크 된 게시물의 불만 사항은 동작이 아닌 bitfield가 포함 된 unitof sizeof()에 대한 것입니다. 구조체 크기는 항상 구현에 따라 다르며 비트 필드와 관련이 없습니다. 비트 필드 멤버의 주소를 알 수 없다는 것에 대한 불만이 있었지만 비트 필드가 작동하고 노조와 아무런 관련이없는 것입니다. – Alan
덜 막연합니다. 일반적으로 저는 마이크로 컨트롤러 용 펌웨어에서 작업하기 때문에 크기/메모리 정렬에 대해 과민 반응을 보입니다. 정렬되지 않은 구조체 또는 변수는 성능에 영향을 미치고 비 원자 적로드 및 저장을 초래할 수 있습니다. 귀하의 마일리지가 다를 수 있습니다. –
예, 가능합니다. 왜 안돼? 공용체의 비트 필드는 다른 곳에서 동작하는 것과 같은 방식으로 동작합니다. 노조 (또는 비트 필드가있는 유니온)의 비트 필드에는 특별한 것이 없습니다.
하나의 공용체 요소에 쓰고 다른 요소에서 읽는 경우에만 안전하지 않습니다. 구현의 세부 사항이 발생하지 않는다면, bitfied (그리고 아마도 다른 멤버들)를 포함하고있는 union은 잘 정의 된 안전한 행동을합니다.
노동 조합 유형의 실행 구현이 정의되어 있지 않습니까? – detly
이것은 C++이 아닙니다. 유니온을 통한 타입 페닝은 C에서 완벽하게 유효하며 C++의 reinterpret_cast와 비슷한 방식으로 작동합니다. Technical Corrigendum 3에서는이를 명확하게 설명합니다. –
노조가 어떻게 작동하는지 생각해 보면 답을 얻을 수 있습니다. 그렇습니다. 물론 그렇습니다. 왜 그렇습니까? 우리가 예상했듯이 노동 조합은 가장 큰 데이텀을 유지하기에 충분히 크므로 자동으로 작습니다. 비트 필드는 "컨테이너"로 압축되며 컴파일러는 최종 실제 크기를 평가할 수 있어야합니다. 다음은 몇 가지 흥미로운 사실을 보여줍니다 (물론 아닌 비트 필드의 존재, 노동 조합의 잘못된 사용입니다!)
#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);
}
- 1. C#의 비트 필드
- 2. C++에서 비트 배열의 필드 조작
- 3. C의 "동적 비트 필드"
- 4. 이것이 가장 적합한 방법입니까? C 비트 필드
- 5. C 표준의 비트 필드 설명을 이해하지 못함
- 6. 마이크로 컨트롤러 비트 필드
- 7. OpenCL 가짜 비트 필드
- 8. FilterIterator 비트 마스크 (또는 비트 필드)
- 9. C/C++에서 니블 (비트 필드 제외) 읽기/쓰기
- 10. 구조체 sparql 쿼리에서 공용체 사용
- 11. 부호가있는 숫자에서 비트 필드 추출
- 12. 데이터베이스의 SQL 비트 필드 업데이트
- 13. 여러 cpp 파일에 대해 클래스/구조체/공용체 사용 C++
- 14. 열거 형 비트 필드 컨테이너 클래스
- 15. C# 비트 비트 XOR 및 파일 I/O
- 16. C 드라이브의 문제 32 비트 및 64 비트?
- 17. MySql에서 비트, 열거 형 및 집합 필드 병합
- 18. int가 아닌 다른 형식의 비트 필드?
- 19. 스레딩 및 비트 맵 메서드 C#
- 20. C 부호없는 int 배열 및 비트 시프트
- 21. C에서 레지스터 비트 필드 재정의에 대한 팁
- 22. 32 비트 및 64 비트 ASP.NET 배포
- 23. C# : 지원 필드 선언 및 요약 태그
- 24. Access 2007 메모 필드 및 C# Winform
- 25. Blackberry의 동일한 가로 필드 관리자에서 필드 및 비트 맵 이미지 편집
- 26. 80x86에 대한 원자 비트 필드 연산은 무엇입니까?
- 27. SubSonic 3.0.0.3 | SimpleRepository - bool 속성의 비트 필드
- 28. C++ 비트 번호 목록
- 29. C#에서 비트 맵 비트 크기 줄이기
- 30. C/C++ 비트 필드 대 비트 단위 연산자를 사용하면 더 빠르고, 더 좋고, 더 이식성이 뛰어 납니까?
이 악한 일을, 그들은 합이나 곱합니까? ;-) –
+1 to Amardeep. do not do 그리고 divya. –
더 가까운 비트 필드와 노조는 악조적이어야합니다. 저는 유니온 구조체를 사용하여 임베디드 소프트웨어에서 바이트 입/출력을 구문 분석합니다. 그 위안은 그 단점을 극복합니다. – schmijos