gpt4 book ai didi

c++ - 关于结构填充

转载 作者:太空狗 更新时间:2023-10-29 19:49:12 25 4
gpt4 key购买 nike

假设我们有一个数据包

struct Foo
{
short size; // 2
short type; // 2
BYTE data; // 1
//1 byte padding not 3?
};

编译后,它的长度为 6 个字节,并在结构末尾添加了 1 个字节的填充。编译器不应该添加 3 个字节的填充以使结构大小为 8 个字节长吗?因为 32 位 cpu 喜欢访问 4 字节 block 中的数据

顺便说一句,#pragma pack(1) 的长度如预期的那样为 5 个字节。

最佳答案

您的struct 包含short,这意味着它们可能需要在两字节边界上对齐。如果您要创建此结构的数组而没有填充,则所有其他元素最终都会出现错误对齐的短裤,这可能会崩溃或变慢。

填充物的存在是为了安全和性能。在某些架构上,未对齐的读取会导致崩溃。因此,编译器填充结构,以便它的成员在可按其大小整除的地址上对齐。除此之外,编译器几乎没有理由添加额外 填充,只是为了将整个结构对齐到 native 单词边界上。所以在你的情况下它只会增加一个字节。

尝试在您的结构中加入一个int。这应该将填充更改为具有额外的 3 个字节的填充。在两个字节之间也有 int 将使填充 字节之间。

编译器可以根据需要自由选择填充,除非您明确指定打包。不同的架构和不同的编译器会发生不同的事情。

关于c++ - 关于结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com