2016-07-05 2 views
6

나는 비트 필드가 아닌 휴대용 것을 주장 비트 필드에 관한 다양한 질문에 많은 코멘트를 건너했지만, 나는 이유를 자세히 설명하는 소스를 찾을 수 없었습니다.왜, 어떻게 C++ 비트 필드는 비 이식?

액면 가격으로, 나는 모든 bitfields가 단지 동일한 bitshifting 코드의 변형으로 컴파일했을 것이라고 추측했지만, 분명히 거기보다 더 많이 있어야하거나 그러한 격렬한 싫어함이 없을 것입니다.

제 질문은 입니다. bitfield를 이식성이 없게 만드는 것은 무엇입니까?

+1

"안전하지 않은"어떤 문맥에서 사용 되었습니까? 링크를 추가 하시겠습니까? – anatolyg

+6

저는 대부분 사람들이 비트 필드를 악용하여 하위 바이트 수준에서 다른 데이터 유형의 표현을 추출하는 방법이라고 생각합니다. 이는 전혀 휴대 할 수 없습니다. – user2357112

+0

@anatolyg [Lundin의 코멘트] (http://stackoverflow.com/questions/) (http://stackoverflow.com/questions/35934375/bitfields-in-c-programming-language/35935493#comment59526628_35934375) [이 질문에] 35934375/bitfields-in-c-programming-language/35935493). 내가 '비 휴대용'만큼이나 '안전하지 못하다'고 비난받는 것을 본 적이 없지만 여전히 그렇습니다. – Pharap

답변

2

비트 필드는 비트 순서가 지정되지 않는다는 점에서 비 휴대용 적입니다. 따라서 컴파일러를 사용하는 인덱스 0의 비트는 다른 컴파일러의 마지막 비트가 될 수 있습니다.

이것은 메모리 매핑 하드웨어 레지스터에 비트를 토글 같은 애플리케이션에 비트 필드를 사용하는 것을 방지한다.

그러나 하드웨어 공급 업체에서 사용하는 비트 필드가 출시 된 코드에서 볼 수 있습니다 (예 : 마이크로 칩과 같은). 대개 컴파일러를 릴리즈하거나 단일 컴파일러를 대상으로하기 때문에 보통 그렇습니다. 예를 들어, 마이크로 칩의 경우 소스 코드에 대한 라이센스로 자신의 컴파일러 (8 비트 로우 엔드 장치 용)를 사용해야합니다.

@Pharap이 가리키는 링크에는 (C++ 14) 이 지정되지 않은 순서와 관련된 표준 : is-there-a-portable-alternative-to-c-bitfields

+2

비트 필드 레이아웃은 구현에 따라 정의됩니다. * 비트 필드를 휴대하지 못하게하지 않습니다. 이식성이없는 특정 레이아웃을 가정 한 코드입니다. – 4386427

+0

@ 4386427 : 비트 필드를 사용하는 일반적인 이유 *는 원하는 레이아웃을 얻는 것입니다. OS API 함수의 인수에서 옵션 비트. 문제는 모든 컴파일러가 동일한 결과를 산출하지는 않는다는 것입니다 (또는 다른 방법으로 표준이 가장 일반적인 사용 사례에 대해 합당한 보장을 제공하지 않음). 결국 누군가가 실수를 저 지르지 만 반드시 원래 프로그래머는 아닙니다. –

+0

@ 4386427 언어 구조가 이식 가능하지 않거나 이식 가능하지 않습니다. 컴파일러가 지원하는지 여부를 결정합니다. 이식성에 관해 이야기 할 때 우리는 항상이 구조체의 사용에 대해 이야기합니다. 나는 그것이 정확할 필요가 있다고 생각하지 않았다. – fjardon

8

비트 필드는 이식 할 수없는 것과 같은 의미로 이식 할 수 없습니다. 당신은 휴대용 프로그램을 작성하는 정수를 사용할 수 있지만 원격 컴퓨터에 그대로 int의 바이너리 표현을 보낼 것으로 예상하고 정확하게 데이터를 해석 기대할 수 없다.

이것은 프로세서의 워드 길이가 다르므로 정수 유형의 크기가 다릅니다 (1.1 바이트 길이도 다를 수 있지만 요즘은 드문 임베디드 시스템입니다). 그리고 2. 바이트 엔디안은 프로세서마다 다릅니다.

이러한 문제를 극복하기 쉽습니다. 네이티브 엔디안은 합의 된 엔디안으로 쉽게 변환 될 수 있으며 (빅 엔디안은 사실상 네트워크 통신의 표준입니다), 컴파일 타임에 크기를 검사 할 수 있고 요즘 고정 길이 정수 유형을 사용할 수 있습니다. 따라서 이러한 세부 정보가 처리되는 한 정수를 사용하여 네트워크를 통해 통신 할 수 있습니다.

비트 필드는 일반 정수 유형을 기반으로하므로 엔디안 및 정수 크기와 동일한 문제가 있습니다. 하지만 그들은 구현을 구체화 even more 있습니다. 그들이

  • 을 다른 사람에 대한 예를 들어, 일부 플랫폼에서 비트 필드는 바이트를 걸쳐없는

    • 클래스 객체 내에서 비트 필드의 실제 할당 세부 사항에 대한

      • 모든 또한, 일부 플랫폼에서는 비트 필드가 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 패킹됩니다.

    • cha R, 명시 적으로 서명 또는 서명되지 않은 짧은, INT, 긴 긴 긴 비트 필드에 서명 또는 서명한다.엔디 언과 달리

    , 정규의 형식을 "실제 할당 세부 사항에 대해 모든 것을"변환하는 사소한 없습니다.

    또한 endianness는 CPU 아키텍처와 관련이 있지만 비트 필드 세부 정보는 컴파일러 구현 자에게 고유합니다. 따라서 비트 필드는 동일한 컴파일러를 사용하여 컴파일 된 것이 확실한 경우가 아니면 동일한 컴퓨터 내의 별도 프로세스 사이에서도 통신을 위해 이식 할 수 없습니다.


    TL, DR 비트 필드는 컴퓨터간에 이식 가능한 방법이 아닙니다. 정수는 어느 쪽도 아니지만, 이식성이 없으면 쉽게 해결할 수 있습니다.