클래스의 비트 너비

Dec 06 2020

다음과 같이 선언 된 클래스가 있습니다.

class Payload {
    uint8_t m_a : 1;
    uint8_t m_b : 5;
    uint8_t m_c : 2;
    uint8_t m_d : 4;
};

보시다시피 sizeof(Payload) == 2. 여태까지는 그런대로 잘됐다. 총 비트 수는 12 개이며 8 비트를 초과하므로 2Byte가 점유됩니다.

그러나 클래스가 선언하는 비트의 양을 얻는 방법이 있습니까? '12'를 돌려 주겠다 ...? 알고리즘이 위와 같이 비트 필드를 정의하는 모든 종류의 클래스에 대해 작동하도록 확실히 만드십시오.

답변

1 dfrib Dec 06 2020 at 04:16

아니요, 표준을 준수하지 않습니다.

[class.bit] / 1 :

비트 필드 속성이 클래스 멤버 유형의 일부가 아닙니다.

이는 컴파일 타임에이 정보를 추출 할 수 없음을 의미합니다. 런타임 인트로 스펙 션 기술을 사용하여이 정보를 찾으려는 모든 종류의 시도는 기껏해야 구현 정의 동작에 의존합니다.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. 이것은 구조의 크기를 바이트 단위로 가져와 바이트 당 비트 수로 곱합니다 (기술적으로 항상 8은 아님). 이것은 비트 필드 포함 구조체가의 배수가 아닌 비트 크기를 가질 수 없기 때문에 작동합니다 CHAR_BIT. 컴파일러는 마지막 멤버 뒤에 패딩 비트를 추가합니다.