GCC uygulanmasında bir hata:C11, aşağıdaki yapı çalışma bit alanları
struct S {
unsigned a : 4;
_Bool b : 1;
};
bir _Bool
, ardından 4 bit kullanıldığı bir unsigned
(4 bayt) olarak GCC tarafından karşıladığı Gets the Toplam uzunluğu 8 bayt olan (1 bayt) 1 bit kullanılır.
C99 ve C11'in özellikle bir bit alanı üyesi olarak _Bool
'a izin verdiğini unutmayın. C11 standart (ve muhtemelen C99 çok) da §6.7.2.1 'Yapısı ve sendika belirticilere' ¶11 altında şöyle denilmektedir:
bir uygulama biraz-alan sığabileceği büyüklükte herhangi adreslenebilir depolama birimi tahsis edebilir. Yeterli boşluk kalırsa, bir yapıdaki diğer bir bit alanını hemen takip eden bir bit alanı, aynı birimin bitişik bitlerine doldurulur.
Yani üyesi yukarıda b
toplam büyüklüğü 4 byte bir yapı ile sonuçlanan üyesi a
için ayrılan depolama birimine, içine paketlenmiş edilmiştir gerektiğine inanıyoruz.
GCC doğru davranır ve iki üyeleri için aynı türleri kullanılırken ambalaj meydana veya bir unsigned
ve diğer signed
, ama tipleri unsigned
ve _Bool
bunları işlemek için GCC tarafından çok farklı sayılabilir görünmektedir zaman doğru şekilde.
Birisi standardı yorumlamamı onaylayabilir mi ve bu gerçekten bir GCC hatası mı?
Ayrıca bir çalışma ile ilgileniyorum (bazı derleyici anahtarı, pragma, __attribute__
...).
Ben -std=c11
gcc'den 4.7.0 kullanıyorum (diğer ayarlar aynı davranışı gösterir rağmen.)
GCC uzantısının '__attribute__ (paketlenmiş)) buradaki üyelere uygulanabileceğini unutmayın. ancak bu problemin ortogonalidir (4 + 1 = 5 boyutunda bir yapıya, yani aynı sorunla sonuçlanır.) – ndkrempel
İlgili: http://stackoverflow.com/questions/308364/c-bitfield-packing-with -boşluklar (ama C++, bit-alanları üzerinde kendi ifadesinde tam olarak yorucu değildir.) – ndkrempel
Yukarıda bağlantılı soruya verilen bir cevaba göre, bu davranış gcc 4.2.4'te oluşmamıştır. o zamandan beri bir gerileme. – ndkrempel