举例来说,我有一个结构定义通过字节数组构造虚拟函数的结构是否安全?
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),可以安全地将它与结构中的虚函数一起使用吗? –