我已经看过将char数组视为struct / class并直接对其进行操作的技术。请参阅以下伪示例:
Struct Container {
char e1;
short e2;
int e3;
Class4 e4;
Class5 e5;
// more...
}
char *msg = char[SOME_SIZE];
// Fill up the msg with some bit stream.
// Then we treat the char array as struct.
Container *ctn = reinterpret_cast<Container *>(msg);
int v3 = ntohl( ctn.e3 );
short v4 = ctn.e4.toValue(); // Call methods of Class4 to output proper value.
int v5 = ctn.e5.toValue();
问题是此技术何时起作用?即对结构及其成员的要求。显然,最大的问题是Container何时具有结构/类对象,如e4和e5。顺便说一句,我想在Linux中使用它。
我想知道这种用法什么时候内存对齐会发挥作用?
如果有一篇好文章可以参考,我将不胜感激。
Re @ ben的评论。我看到的用例是从套接字接收消息,其中消息格式定义良好。认为这里的动机是需要速度。使用这种技术,我们不需要复制任何字段以便将它们填充到结构中,只需直接使用它们即可。这节省了一些内存和CPU时间。
我在考虑如何处理对齐。
答案 0 :(得分:1)
问题是这种技术何时起作用?
当字符缓冲区持有有效的Container
对象(这意味着所有数据成员和基础也必须有效地递归)时,它才能正常对齐(即地址是{的倍数{3}} (Container)
。
通常,在那里获取有效对象意味着使用展示位置new
,但在多进程代码中 - 当通过IPC机制接收/访问对象时 - 您应该警惕以下内容:
引用或指针(包括指向虚拟调度表的指针),因为它们通常不会在您自己的应用程序的虚拟地址空间中设置为有意义的东西(除非另一个进程例如固定内存)映射的段在同一个硬编码的虚拟地址上),
文件/套接字描述符,资源ID,引用计数等,可能在您的过程中无效,
字节序,32位与64位大小,系统之间的对齐和填充差异,
清理操作,例如观察员或管理对象中的对象注销,如果在您的过程中没有实际创建对象,则无法理解。
它的大多数常识 - 在POD末端很容易,并且在复杂对象端很少有价值(通过正确的序列化/反序列化)。