Chr*_*ian 3 c++ struct padding packet
假设我们有一个数据包
struct Foo
{
short size; // 2
short type; // 2
BYTE data; // 1
//1 byte padding not 3?
};
Run Code Online (Sandbox Code Playgroud)
编译后,它的长度为6个字节,在结构的末尾添加了1个字节的填充.是不是编译器应该添加3个字节填充,以便结构大小是8个字节长?因为32位cpu喜欢以4字节块的形式访问数据
顺便说一下#pragma pack(1)它的长度是5个字节,正如预期的那样.
你的struct包含shorts意味着那些可能需要在两个字节的边界上对齐.如果你要创建没有填充的这个结构的数组,那么每个其他元素最终都会被错误地对齐,这可能会崩溃或变慢.
填充存在是出于安全和性能的目的.在某些体系结构上,未对齐的读取会导致崩溃.因此编译器填充结构,以便它的成员对齐可按其大小分类的地址.除此之外,编译器没有理由添加额外的填充只是为了对齐本机字边界上的整个结构.所以在你的情况下它只会添加一个字节.
尝试int在你的结构中使用.这应该更改填充以具有额外的3个字节的填充.还具有int两个字节之间将会使填充之间的字节数.
编译器可以自由地做任何关于填充的选择,除非你明确指定打包.不同的架构和不同的编译器会发生不同的事情.