Data structures VS_VERSIONINFO结构-不必要的填充

Data structures VS_VERSIONINFO结构-不必要的填充,data-structures,padding,memory-alignment,resource-files,versioninfo,Data Structures,Padding,Memory Alignment,Resource Files,Versioninfo,我从一个文件中获取了结构,值(VS_FIXEDFILEINFO)填充了32位 根据MSDN,值应该填充到32位边界上 填充1 类型:WORD 包含在32位边界上对齐值成员所需的尽可能多的零字 但值已在32位边界上。 为什么在32位边界上用32位填充VS_FIXEDFILEINFO? 要对齐32位边界上的数据,只有小于32位的填充才有意义 我这样问是因为我需要解析一个RC脚本并生成这个资源 填充被添加到结构及其成员中,以便CPU可以使用与CPU字宽对齐的地址访问包含这些成员的内存 在黑暗的日子里,

我从一个文件中获取了结构,值(VS_FIXEDFILEINFO)填充了32位

根据MSDN,值应该填充到32位边界上

填充1

类型:WORD

包含在32位边界上对齐值成员所需的尽可能多的零字

但值已在32位边界上。
为什么在32位边界上用32位填充VS_FIXEDFILEINFO?
要对齐32位边界上的数据,只有小于32位的填充才有意义

我这样问是因为我需要解析一个RC脚本并生成这个资源


填充被添加到结构及其成员中,以便CPU可以使用与CPU字宽对齐的地址访问包含这些成员的内存

在黑暗的日子里,如果您进行非对齐访问,一些CPU可能会被说服生成总线错误,但现在它只是变慢了,特别是如果您错过了板载缓存

VS_FIXEDFILEINFO
是任意长度的任意数据,因此它后面可能会出现一些填充,以使后续的
VS_VERSIONINFO
结构成员重新对齐


文件的措辞:<代码> WLIME < /> >成员>代码> VSV版本信息> /代码>暗示您不应该考虑在<>代码> VSX版本信息> /代码>之间的填充。i、 e.不要从第一个结构中减去下一个结构的地址,并将其用作
wLength
,因为您可能会在两个结构之间引入一些您不想要的填充字节。

噢,所以他们想说的是,wLength不包括VS_VERSIONINFO结构之间的任何填充,不在其成员之间填充。但是,szKey已经落在了32位的边界上。这32位的填充是不必要的。MS docs说“Padding1:包含在32位边界上对齐值成员所需的尽可能多的零字。”但值已经在32位边界上。将32位边界上的数据与32位填充对齐是没有意义的。只有小于32位的填充才有意义。我认为他们试图说(不是很清楚)如果
VS_VERSIONINFO
结构本身不是从32位边界开始的,那么
Padding1
就是为了确保
Value
肯定会这样做。平心而论,他们最后确实声明,这不是实际的语言结构,只是表示版本资源的内存组织的一种方便方式。在字里行间阅读并注意到16位的填充单位,我想这种填充是在结构从16位窗口迁移到32位窗口的过程中出现的。“VS_VERSIONINFO”是一个unicode字符串,因此它需要以null结尾,因此szKey比我在图片中实际标记的长度长2个字节,填充实际上是16位,而不是32位。现在它是有意义的。我也在尝试读/写资源,我只想指出,VS_VERSIONINFO上的文档似乎不正确,至少在我尝试过的示例中不正确。在VS_FIXEDFILEINFO之后显示“padding2()”,但似乎没有padding2,因为VS_FIXEDFILEINFO已经在32位边界上结束,第一个子项在VS_FIXEDFILEINFO之后开始,没有padding2。