如何利用尾巴填充?

时间:2018-10-30 19:38:12

标签: c++

看下面这个简单的代码:

paste -d'#' file1 file2 | sed -n 's/^N#.*/waste/p;s/^[^#]*#//w newfile'

在当前的编译器中,struct Foo { short a; char b; }; struct Bar: Foo { char c; }; 是6。这是正常的,因为sizeof(Bar)是4,并且 sizeof(Foo)被添加到其中,我们得到了5个字节,并且由于Bar::c的对齐方式为2,因此其大小为6。

但是,如果Bar不是标准布局,则允许编译器将Bar放在c的尾部填充中,因此Foo将是4。

实现此目标的最惯用的方法是什么(减少干扰性修改,最清晰的方法)?

2 个答案:

答案 0 :(得分:2)

  

对于当前的编译器,sizeof(Bar)为6。

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

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

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

答案 1 :(得分:1)

我找到了一种简单的方法:

struct Empty { };

struct Foo: Empty {
    short a;
    char b;
};

struct Bar: Foo {
    char c;
};

这里sizeof(Bar)是4,而Foo仍然是标准布局类(对我而言这不是必需的,但很高兴拥有)。