看下面这个简单的代码:
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。
实现此目标的最惯用的方法是什么(减少干扰性修改,最清晰的方法)?
答案 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
仍然是标准布局类(对我而言这不是必需的,但很高兴拥有)。