3

我的应用程序byte[]通过网络接收到一个包含我无法控制的固定大小结构的成员表示的网络。让我们称之为Data

struct Data {
  int id;
  int count;
}

这很好用:

char buffer[]; // filled with bytes from the network...

Data data;
memcpy(&data, data, sizeof(Data));

现在,我想让Data类型从具有(纯)虚函数的类继承:

struct Data : public SomethingVirtual {
  int id;
  int count;
}

上面的代码不再有效。对于虚拟类,实例的前 N ​​个字节似乎包含指向 vtable 的指针,因此数据是偏移的。

我可以增加调用 to 的指针memcpy,但我现在想知道这种方法是否被误导了。如果可能的话,我想避免有太多的间接层或内存复制。此外,该方法理想情况下应该适用于体系结构和编译器,尽管我主要针对使用 g++ 的 i686。

这个问题有什么好的解决方案?

4

2 回答 2

3

一旦您从某物派生并且它具有虚拟成员,它就不再是 POD。您最好的解决方案是序列化到您的数据结构中,然后在琐碎的数据之上构建您的虚拟类。

struct  Data
{...}

struct AddedValue : public SomethingVirtual 
{
   AddedValue(Data)
private:
   Data MyData;
}
于 2013-04-17T15:43:24.860 回答
2

您不能在非 POD 类型上使用 memcpy。可能的解决方案是使用聚合而不是继承。并且将 Data 作为成员值,它仍然是 POD 类型,因此可以在 memcpy 中使用。

于 2013-04-17T15:41:45.993 回答