2013-07-18 3 views
10

C/C++ 비트 필드는 하드웨어 드라이버 및 이진 네트워크 전송에 많은 응용 프로그램이있는 것 같습니다. 그러나 C99 표준의이 따옴표에서 볼 수 있듯이 실제 바이너리 레이아웃은 구현에 따라 다르기 때문에 널리 사용되는 것은 아니며 일반적으로 사용하지 않는 것이 좋습니다. 6.7.2.1.10 - "구조 및 조합 지정자";Bitfields, 구현이 특별한 이유는 무엇입니까?

구현은 비트 필드를 보유 할만큼 충분히 큰 주소 지정 가능한 저장 장치를 할당 할 수 있습니다. 충분한 공간이 남아있는 경우, 구조 내의 다른 비트 필드 바로 뒤에 오는 비트 필드는 동일한 유닛의 인접한 비트로 패킹되어야합니다. 공간이 충분하지 않은 경우 적합하지 않은 비트 필드가 다음 유닛에 삽입되거나 인접한 유닛과 중첩되는지 여부는 구현에 따라 결정됩니다. 단위 내의 비트 필드 할당 순서 (상위에서 하위 또는 하위에서 상위)는 구현에 따라 정의됩니다. 주소 지정 저장 장치의 정렬은 지정되지 않습니다.

제 질문은 간단합니다. 왜위원회는 비트 필드를 특정 구현 특정 항목으로 남겨두기로 결정하여 컴파일러 구성으로 만들었는데, 이는 주로 메모리 사용량을 줄이기 위해 사용할 수 있습니다. 대부분의 경우 이진 레이아웃을 제공하고 무료로 사용할 수있었습니다. 개발자는 비트 - 바이올린 코드에서?

+0

나는 몇 가지 이유를 생각할 수 있습니다. 또한 비트 필드를 부분적으로 하나의 바이트에 넣는 것은 성능에 미치는 영향이 거의 없기 때문에 컴파일러는 속도 또는 크기 최적화의 사용자 설정에 따라 컴파일러가 자유롭게 선택할 수 있습니다. –

+1

바이트 당 비트 수는 8 일 필요가 없다는 사실도 분명합니다. –

+0

@ Mr Lister : 필드가 다음 바이트에서 정렬되고 따라서 바이트 중간에서 시작하지 않도록하려면 0 크기 비트 필드가 지정됩니다. 맞습니까? - 이미 표준에 들어 있습니다. – Skeen

답변

7

다른 많은 것들이 표준에 의해 엄격하게 지정되지는 않았습니다. 많은 수의 플랫폼과 시스템에 대해 호환 컴파일러를 생성 할 수있는 유연성을 허용하면서도 효율적인 컴파일러를 유지합니다.

특히 특정 비트/바이트 순서로 저장해야하는 비트 필드는 원래의 바이트 순서가 "잘못된 방향"인 컴퓨터에서 매우 느려질 수 있습니다.

예, 비트 맵을 여러 아키텍처와 플랫폼에 이식 할 수있게 만드는 것이 올바른 것입니다. 당신이 정말로 그것을 필요로한다면 아마도 다른 해결책을 고려해야 할 것입니다 ...

+1

적어도 저의 세계에서는 느린 기능을 피하기 위해 사용할 수없는 기능으로 끝났습니다. – Skeen

+2

아니요, 완벽하게 사용할 수 있습니다. 오랫동안 휴대 할 수 있어야합니다. 많은 아키텍처에서 주요 차이점은 비트 순서가 아닌 바이트 순서이므로 프로세서가 동일하면 괜찮습니다. 그리고 대부분의 사람들은 그것이 효율적이지 않은 경우 (적어도 완벽하게 이식 가능하고 잘 정의 된) 적어도 큰소리로 불평 할 것이라고 확신합니다. –

+1

당신은 아마도 옳은 편이 겠지만, 내가 성능이 필요할 때마다 나는 잘 정의 된 비트 필드를 갖고 싶어 할 것이고, 그때 나 스스로 비트 피딩을 할 것입니다. – Skeen

관련 문제