Sedikit lebar kelas

Dec 06 2020

ada kelas yang dideklarasikan sebagai:

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

Anda lihat, itu sizeof(Payload) == 2. Sejauh ini bagus. Jumlah total bit adalah 12, melebihi 8bit sehingga 2Bytes ditempati.

Tetapi apakah ada cara untuk mendapatkan jumlah bit yang dideklarasikan oleh kelas? Maksudku mengembalikan '12' ...? Pastikan untuk membuat algoritme berfungsi untuk semua jenis kelas yang menentukan bitfield seperti di atas, secara teoretis dalam berbagai ukuran ...

Jawaban

1 dfrib Dec 06 2020 at 04:16

Tidak, tidak dengan cara yang sesuai standar.

[class.bit] / 1 :

atribut bit-field bukan bagian dari tipe anggota kelas

yang berarti informasi ini tidak dapat diambil pada waktu kompilasi. Segala jenis upaya untuk menemukan informasi ini menggunakan teknik introspeksi waktu proses akan mengandalkan, paling banter, perilaku implementasi yang ditentukan.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. Ini mendapatkan ukuran struktur dalam byte dan mengalikannya dengan jumlah bit per byte (secara teknis tidak selalu 8). Ini berfungsi karena struct yang berisi bitfield tidak dapat memiliki ukuran dalam bit yang bukan kelipatan CHAR_BIT. Kompilator akan menambahkan bit padding setelah anggota terakhir.