舉例來說,我有一個結構定義通過字節數組構造虛擬函數的結構是否安全?
struct Data {
uint8_t data1;
uint16_t data2;
virtual uint8_t getData1() { return data1; }
virtual uint16_t getData2() { return data2; }
}
我有一個字節數組
uint8_t data[3];
它是安全的這樣做:
Data *d = (Data*)data;
我問,因爲我讀具有虛函數的類存儲 虛擬表指針並且沒有標準定義它在哪裏存儲 在對象中編輯。另外,如果我繼承的數據,例如
struct Data2 : Data { uint8_t data3;
virtual uint8_t getData3() { return data3; } }
什麼可以的順序成員變量在數據2 的對象存儲?如果我在一個字節數組上施加Data2結構,它會在 的順序data1,data2,data3?先謝謝你。
因爲你遇到了對齊問題(和'struct Data {uint8_t data1; uint16_t data2;}'幾乎肯定會有大小4,而不是3),所以這是不安全的。 – melpomene
一個首選的方法是從緩衝區單獨分配成員到結構中。這可以讓你處理對齊和endian問題。 –
對不起,忘記提及存儲Allignment。即使使用分配宏作爲#pragma(pack,1),可以安全地將它與結構中的虛函數一起使用嗎? –