对象的大小和 C++ 标准

Size of object and C++ standard

环顾四周,我发现很多地方都解释了获取特定对象(class 或结构)大小的方法。我读到了填充,关于虚函数 table 影响大小以及“纯方法”对象的大小为 1 字节的事实。但是我找不到这些是关于实现还是 C++ 标准的事实(至少我没能找到所有的)。

特别是我处于以下情况:我正在处理一些在某些对象中编码的数据。这些对象 保存指向其他数据的指针。它们不继承任何其他 class,但它们有一些方法(非虚拟)。我必须将这些数据放在缓冲区中才能通过某个套接字发送它们。现在阅读我上面提到的,我只是将我的对象复制到发送缓冲区,注意数据被正确地“序列化”,即对象的每个成员都被复制,并且方法不影响字节结构。

我想知道我得到的是因为编译器的实现还是标准规定的。

您应该使用 POD(普通旧数据)。如果一个结构没有虚拟 table、一些构造函数、私有方法和许多其他东西,它就是 POD。 保证 pod 数据按声明顺序放在内存中。 pod 数据对齐。你应该指定右对齐(这是你的决定)。参见#pragma pack (push, ???).

类 的内存布局未在 C++ 标准 中准确指定。甚至没有指定标量对象(如整数)的内存布局。它们由语言实现来决定,并且通常取决于底层硬件。该标准确实指定了特定于实现的布局必须满足的限制。

如果一个类型是普通可复制的,那么它可以通过将其内存复制到缓冲区中来“序列化”,并且可以像您描述的那样反序列化。但是,这种简单的序列化仅在反序列化的进程使用相同的内存布局时才有效。这通常不能假设是这种情况,因为另一个进程可能 运行 在完全不同的硬件上并且可能是用不同(版本)的编译器编译的。