2013-02-28 23 views
6

Belirli bir sınıf boyutunu elde etmek için C++ bit alanlarını kullanmaya çalışıyorum C++ bit alanları kullanarak niteliklerini, ama nedense beklediğimden daha büyük.Misalligned sınıfının

Sorun, (sizeof argüman olarak geçirilen) 32 bit (4 bayt) olan bir sınıf 5 bayt bildiriyor. Örnek sınıfı körük: four_bit_field ve eight_bit_field konumları değiştirilir ise

typedef unsigned char u8; 
typedef unsigned int u32; 

class Test { 
    u8 four_bit_field : 4; 
    u8 eight_bit_field; 
    u32 twenty_bit_field : 20; 
}__attribute__((packed)); 

, uygun boyutu, 4 bayt geri sizeof. Muhtemelen bir hafıza düzenleme sorunu olduğuna inanıyorum.

Yani birinin bu davranışın arkasında yatan sebebi bilir? Ve en önemlisi, herhangi bir pozisyon değiştirmeden bunu nasıl düzeltebilirim.

cevap

10

biraz sayımı olmadan u8 alan yerine başka bit alanları ile dolu olmaktan çok, bir sonraki bayt sınırının hizalanmış ediliyor. Böylece ilk 4 bit bir bayt alır, ikinci 8 bit bir bayt alır ve son 20 bit, toplam 5 bayt alır. 5

8 bit alana bir bit alan boyutu eklerseniz, bunu görürsünüz. http://ideone.com/Bexw6l

+0

. Ama bu konuya bir çözüm arıyorum. – braunmagrin

+0

@braunmagrin, ben çözümü test meşguldü, benim düzenlemeyi görüyoruz. –

+0

Acele ettiğim için üzgünüm. Teşekkürler, bu çözüldü. – braunmagrin

2

, gerçekten de, aynı hizada bulunan bir sorundur Bu. u8 eight_bit_field bu, bir saklayıcısında olmayan bir düz doğal bir bayt sınırında hizalanmış signed char veya unsigned char, (adından) ve bir charunsigned char.

Bu nedenle four_bit_field ve eight_bit_field ve twenty_bit_field sonra doldurma 4 bit arasındaki doldurma 4 bit ile son bulur; ikincisi muhtemelen türetilmiş bir sınıf tarafından yeniden kullanılabilir, eski sonsuza kadar kaybetti. 1 byte uyum zorlayarak

2

Dene:

Bunun bir hafıza allignment sorundur derken öyle düşündüm
#pragma pack(1) 
class Test { 
    u8 four_bit_field : 4; 
    u8 eight_bit_field : 8; 
    u32 twenty_bit_field : 20; 
}; 
#pragma pack() 
+0

Teşekkürler, # pragma'nın direktiflerinden habersizdim. Her zaman öğreniyor ... – braunmagrin

İlgili konular