首页 > 解决方案 > 如何利用尾部填充?

问题描述

看看这个简单的代码:

struct Foo {
    short a;
    char b;
};

struct Bar: Foo {
    char c;
};

在当前的编译器中,sizeof(Bar)是 6。这是正常的,就像sizeof(Foo)4 一样, Bar::c加上它,我们得到 5 个字节,因为Bar' 的对齐方式是 2,所以它的大小为 6。

但是,如果Bar不是标准布局,那么编译器将被允许放入c的尾部填充中Foo,因此sizeof(Bar)将是 4。

实现此目的最惯用的方法是什么(侵入性较小的修改,最清晰的方法)?

标签: c++

解决方案


使用当前的编译器,sizeof(Bar)是 6。

这实际上是一个错误的假设,即使您可以定义“当前编译器”是什么。“标准布局”也是一个毫无意义的流行语。

如果我正确理解您要达到的目标,#pragma pack那就是答案。您可以逐个类地指示编译器使用什么字节打包。

通常对于网络传输,您可能希望使用 1 的包装,而对于其他任何事情(内存操作、存储等),只需让编译器为您完成。它通常会将您的字段填充到字边界上,以获得最大的访问性能(不要与缓存性能混淆)。


推荐阅读