Twincat 3 - SizeOf 返回错误的结构大小
Twincat 3 - SizeOf returning wrong structure size
我有一个结构,正在尝试获取该结构的大小。 SizeOf
returns 16,但我期待 14 作为答案。
2+2+4+2+2+2=14
通过使用指针,我注意到结构末尾有 2 个空字节。
如果我用 UINT 替换 UDINT 那么大小是正确的。如果我把UDINT放在结构的末尾,那么这两个空字节就放在iCrateCnt之后。
这让我相信 sizeOf 工作正常,但由于某些未知原因,在我的结构中某处放置了两个我未使用的额外字节。
为什么会这样,如何解决?
pack_mode
属性可用于消除结构中未使用的字节。
SIZEOF() 返回的意外大小是由于所谓的 'padding bytes'。
这些填充字节出现的位置取决于:
- 使用的系统(Tc2 x86、Tc2 ARM、Tc3)
- 使用的数据类型
- 定义这些数据类型(c.q.变量)的顺序
有关填充字节的详细信息,请参阅 Alignment and Structures
正如 Kolyur 正确提到的,属性 Pack_Mode 可用于控制这些填充字节。
例如在 Tc3 中:
TYPE HMI_POPUPSTRUCT : // The total size of this struct is 8 bytes
STRUCT
bVar1: BOOL; // At byte 0.
// At byte 1 there will be a padding byte
bVar2: INT; // At byte 2 and 3
bVar3: BOOL; // At byte 4
bVar4: BOOL; // At byte 5
bVar5: BOOL; // At byte 6.
// At byte 7 there will be a padding byte (8th byte)
END_STRUCT
插入时
{attribute 'pack_mode' := '0'}
或
{attribute 'pack_mode' := '1'}
就在结构之上,那么不会有任何填充字节导致 struct-size 为 6 个字节而不是 8 个字节。
我有一个结构,正在尝试获取该结构的大小。 SizeOf
returns 16,但我期待 14 作为答案。
2+2+4+2+2+2=14
通过使用指针,我注意到结构末尾有 2 个空字节。
如果我用 UINT 替换 UDINT 那么大小是正确的。如果我把UDINT放在结构的末尾,那么这两个空字节就放在iCrateCnt之后。
这让我相信 sizeOf 工作正常,但由于某些未知原因,在我的结构中某处放置了两个我未使用的额外字节。
为什么会这样,如何解决?
pack_mode
属性可用于消除结构中未使用的字节。
SIZEOF() 返回的意外大小是由于所谓的 'padding bytes'。 这些填充字节出现的位置取决于:
- 使用的系统(Tc2 x86、Tc2 ARM、Tc3)
- 使用的数据类型
- 定义这些数据类型(c.q.变量)的顺序
有关填充字节的详细信息,请参阅 Alignment and Structures
正如 Kolyur 正确提到的,属性 Pack_Mode 可用于控制这些填充字节。
例如在 Tc3 中:
TYPE HMI_POPUPSTRUCT : // The total size of this struct is 8 bytes
STRUCT
bVar1: BOOL; // At byte 0.
// At byte 1 there will be a padding byte
bVar2: INT; // At byte 2 and 3
bVar3: BOOL; // At byte 4
bVar4: BOOL; // At byte 5
bVar5: BOOL; // At byte 6.
// At byte 7 there will be a padding byte (8th byte)
END_STRUCT
插入时
{attribute 'pack_mode' := '0'}
或
{attribute 'pack_mode' := '1'}
就在结构之上,那么不会有任何填充字节导致 struct-size 为 6 个字节而不是 8 个字节。