修复︰ 将生成访问结构成员或类成员的偏移量不正确使用 Visual Studio 2008 SP1 中 /Ox 选项或 /O2 选项编译应用程序时


症状


请考虑以下情形。
  • 您创建的应用程序从一个结构或 Microsoft Visual Studio 2008 Service Pack 1 (SP1) 中的类加载一个字节。
  • 您打开/Ox优化选项或/O2优化选项。
  • 通过使用发布配置为 x64 编译应用程序的平台。
在这种情况下,生成访问结构成员或类成员的偏移量不正确。

只有当结构大小和偏移量或类大小和偏移量等于一个以下对出现此问题︰

  • (14,13)
  • (15,13)
  • (22,21)
  • (23,21)
  • (30,29)
  • (31,29)

解决方案


修补程序信息

受支持的修补程序现已从 Microsoft 推出。但是,它被用于纠正本文中描述的问题。它仅应用于正经历此特定问题的系统。此修补程序可能会接受进一步的测试。因此,如果这个问题没有对您造成严重的影响,我们建议您等待包含此修复程序的下一步的 Visual Studio 2008 service pack。

要立即解决此问题,请联系 Microsoft 客户支持服务,以获取此修复程序。Microsoft 客户支持服务的电话号码以及有关支持费用的信息的完整列表,请访问下面的 Microsoft 网站:注意: 在特殊情况下,如果 Microsoft 支持专业人员确定某个特定的更新能够解决您的问题,可能取消的通常情况下收取的电话支持服务费用。照常收取支持费用将应用于其他支持问题和对于特定更新无法解决的问题。

系统必备组件

您必须具有要应用此修补程序的安装的 Visual Studio 2008 Service Pack 1。

重启要求

应用此修补程序后,不需要重新启动计算机。

修补程序替换信息

此修补程序不替换任何其他修补程序。

文件信息

此修复程序的英文版具有的文件属性 (或更新的文件属性)在下表中列出。日期和为这些文件的时间以协调世界时 (UTC) 列出。当您查看文件信息时,它将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用控制面板中的日期和时间项中的时区选项卡。
文件名称文件版本文件大小日期时间平台
C2.dll15.0.30729。 40822,283,3202009 年 03 月 19-05:13x86
C2.dll15.0.30729.40822,36 1,6562009 年 03 月 19-05:13x86
C2.dll15.0.30729.40823,01 7,5282009 年 03 月 19-05:13x64
Link.exe9.0.30729.40821,0 54,5202009 年 03 月 19-05:13x64
Link.exe9.0.30729.4082799、 03219-Mar-200905:13x86

解决方法


若要变通解决此问题,请添加一个或多个虚拟"无符号的字符型"成员来扩展的结构或 8 个字节的最小倍数的类的大小。例如,延长 14 到 16 个字节的字节数。

状态


Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。

详细信息


有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
用于描述 Microsoft 软件更新的标准术语的824684说明

重现问题的步骤

  1. 创建的应用程序名为 Test.cpp 通过在 Visual Studio 2008 SP1 中使用以下代码︰
    typedef struct DskDecimal
    {
    unsigned char precision;
    unsigned char scaleFactor;
    unsigned short value[ 5];
    unsigned char maxPrecision;
    unsigned char maxScaleFactor;
    } DskDecimal;

    int main()
    {
    DskDecimal decimal;
    decimal.maxScaleFactor = 4;
    DskDecimal self = decimal;
    return self.maxScaleFactor;
    }
  2. 通过使用以下命令编译该应用程序︰
    cl test.cpp /O2 /MD
预期的结果是 4。但是,实际的结果为 0。