Bir sınıfın bit genişliği

Dec 06 2020

şu şekilde beyan edilmiş bir sınıf var:

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

görüyorsunuz sizeof(Payload) == 2,. Çok uzak çok iyi. Toplam bit miktarı 12'dir, 8 bit'i aştığı için 2Byte kullanılır.

Ancak sınıfın bildirdiği bit miktarını elde etmenin bir yolu var mı? '12' demek istiyorum ...? Yukarıdaki gibi, her boyutta teorik olarak, yukarıdaki gibi bit alanlarını tanımlayan her tür sınıf için algoritmanın çalışmasını sağlayın ...

Yanıtlar

1 dfrib Dec 06 2020 at 04:16

Hayır, standartlara uygun bir şekilde değil.

[class.bit] / 1 :

bit alanı niteliği, sınıf üyesinin türünün bir parçası değildir

bu, bu bilgilerin derleme sırasında çıkarılamayacağı anlamına gelir. Çalışma zamanı iç gözlem tekniklerini kullanarak bu bilgileri bulmaya yönelik her türlü girişim, en iyi durumda, uygulama tanımlı davranışa dayanacaktır.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. Bu, yapının boyutunu bayt cinsinden alır ve onu bayt başına bit sayısıyla çarpar (teknik olarak her zaman 8 değildir). Bu işe yarar çünkü bit alanı içeren yapıların bit cinsinden boyutunun katı olmayan bit değerleri olamaz CHAR_BIT. Derleyici, son üyeden sonra dolgu bitleri ekleyecektir.