【问题标题】:VS_VERSIONINFO structure - unnecessary paddingVS_VERSIONINFO 结构 - 不必要的填充
【发布时间】:2015-01-21 13:37:19
【问题描述】:

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

根据 MSDN,值应被填充以落在 32 位边界上。

填充1

类型:WORD

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

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

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

【问题讨论】:

    标签: data-structures padding memory-alignment resource-files versioninfo


    【解决方案1】:

    向结构及其成员添加填充,以便 CPU 可以使用与 CPU 字宽对齐的地址访问保存这些成员的内存。

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

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

    MS 文档对VS_VERSIONINFOwLength 成员的措辞暗示您不应考虑在您正在查看的VS_VERSIONINFO 和内存中的下一个之间进行填充。即不要从第一个结构中减去下一个结构的地址并将其用作wLength,因为您可能会在两个结构之间引入一些您不想要的填充字节。

    【讨论】:

    • 哦,所以他们想说的是 wLength 不包括 VS_VERSIONINFO 结构之间的任何填充,而不是其成员之间的填充。但是,szKey 仍然会落在 32 位边界上。那些 32 位的填充是不必要的。 MS 文档说“Padding1:包含尽可能多的零字,以在 32 位边界上对齐 Value 成员。”但 Value 已经在 32 位边界上。将 32 位边界上的数据与 32 位填充对齐是没有意义的。只有少于 32 位的填充才有意义。
    • 我认为他们试图说(不是很清楚)如果 VS_VERSIONINFO 结构本身没有从 32 位边界开始,那么 Padding1 可以确保 Value肯定会的。公平地说,他们最后确实声明这不是实际的语言结构,而只是表达版本资源的内存组织的一种方便方式。在行间阅读并注意 16 位的填充单元,我希望这种填充出现在从 16 位 Windows 迁移到 32 位 Windows 的结构期间。
    • 天哪,我瞎了。 “VS_VERSIONINFO”它是一个unicode字符串,所以需要以null结尾,所以szKey比我在图片中实际标记的要长2个字节,而填充实际上是16位,而不是32位。现在说得通了。跨度>
    • 我也在尝试读/写资源,我只想提一下 VS_VERSIONINFO 上的文档似乎不正确,至少在我尝试过的示例中不正确。它在 VS_FIXEDFILEINFO 之后显示“padding2()”,但似乎没有 padding2,因为 VS_FIXEDFILEINFO 已经在 32 位边界上结束,第一个孩子在 VS_FIXEDFILEINFO 之后开始,没有 padding2。
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2011-08-13
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多