gpt4 book ai didi

d - 关于 'align' 属性的混淆

转载 作者:行者123 更新时间:2023-12-02 02:37:48 25 4
gpt4 key购买 nike

据我所知,align 属性有一个 few different使用形式。

在我的第一次尝试中,我按如下方式使用它:

align(1)
private struct TGAHeader
{
ubyte idLenght;
ubyte hasColormap;
ubyte imageType;
ushort cmFirstEntry;
ushort cmLength;
ubyte cmSize;
ushort xOrigin;
ushort yOrigin;
ushort width;
ushort height;
ubyte pixelDepth;
ubyte imageDescriptor;
}

// TGAHeader.sizeof == 20

这导致结构被填充了 2 个额外不需要的字节。

更改为:

private struct TGAHeader
{
align(1):
ubyte idLenght;
ubyte hasColormap;
ubyte imageType;
ushort cmFirstEntry;
ushort cmLength;
ubyte cmSize;
ushort xOrigin;
ushort yOrigin;
ushort width;
ushort height;
ubyte pixelDepth;
ubyte imageDescriptor;
}

// TGAHeader.sizeof == 18

我得到了预期的 18 个字节的 header 大小。

所以我的疑问是:如果 align 属性的第一种形式似乎没有按照预期对齐数据,那么它的实际用途是什么?

最佳答案

引用您提供的链接:

The alignment for the fields of an aggregate does not affect the alignment of the aggregate itself - that is affected by the alignment setting outside of the aggregate.

因此,第二种形式对齐结构体的字段。第一个对齐结构本身。

在您的示例中,考虑更大的对齐方式 - 例如 16。第一个表单将产生以下布局

TGAHeader.sizeof                   = 32   // the padding was added in the end of the struct  
TGAHeader.idLenght.offsetof = 0
TGAHeader.hasColormap.offsetof = 1
TGAHeader.imageType.offsetof = 2
TGAHeader.cmFirstEntry.offsetof = 4
TGAHeader.cmLength.offsetof = 6
TGAHeader.cmSize.offsetof = 8
TGAHeader.xOrigin.offsetof = 10
TGAHeader.yOrigin.offsetof = 12
TGAHeader.width.offsetof = 14
TGAHeader.height.offsetof = 16
TGAHeader.pixelDepth.offsetof = 18
TGAHeader.imageDescriptor.offsetof = 19

第二种形式将导致

TGAHeader.sizeof                   = 192 // every field was padded
TGAHeader.idLenght.offsetof = 0
TGAHeader.hasColormap.offsetof = 16
TGAHeader.imageType.offsetof = 32
TGAHeader.cmFirstEntry.offsetof = 48
TGAHeader.cmLength.offsetof = 64
TGAHeader.cmSize.offsetof = 80
TGAHeader.xOrigin.offsetof = 96
TGAHeader.yOrigin.offsetof = 112
TGAHeader.width.offsetof = 128
TGAHeader.height.offsetof = 144
TGAHeader.pixelDepth.offsetof = 160
TGAHeader.imageDescriptor.offsetof = 176

关于d - 关于 'align' 属性的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24400229/

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