Sedikit lebar kelas
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
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.
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.