C ++ Struct Size C ++ / CLI中不等C ++结构大小?

时间:2014-05-06 11:25:23

标签: c++ struct c++-cli

我的问题是指标题中提到的问题。

我在头文件中有一个简单的结构,如下所示:

typedef struct
{
    WORD FileType;          // File ID (0x7000)
    WORD HeaderSize;        // Size of this file header in Bytes
    WORD HeaderVersion;     // yy.y
    ULONG FileSize;         // Size of the whole file in Bytes
    WORD ImageHeaderSize;   // Size of the image header in Bytes
    WORD ULX, ULY, BRX, BRY;// bounding rectangle of the image
    WORD NrOfFrames;        // self explanatory
    WORD Correction;        // 0 = none, 1 = offset, 2 = gain, 4 = bad pixel, (ored)
    double IntegrationTime; // frame time in microseconds
    WORD TypeOfNumbers;     // short, long integer, float, signed/unsigned, inverted, 
                            // fault map, offset/gain correction data, badpixel correction data
    BYTE x[WINRESTSIZE];        // fill up to 68 byte
} WinHeaderType;

如果我在C控制台应用程序中调用sizeof(WinHeaderType),我得到68, 但如果我在C ++ / CLI中使用相同的参数调用相同的函数,我得到80。

有人可以向我解释这种行为吗?

我对C ++ / CLI很陌生,事实上我之前从未使用它 (几天前开始),但我需要为.NET应用程序创建一个dll。

由于这是我的第一篇文章,我希望我没有违反任何论坛规则。

Greez, 沫

[编辑]它变得陌生和陌生......

第一行:C控制台应用程序输出

第二行,第一列:C / C ++控制台应用程序我编码以检查数据类型大小。

第二行,第二列:C ++ / CLI控制台应用程序我编码以检查数据类型大小。

第一个申请的来源:http://fbe.am/sId

最近两个应用程序的项目文件:http://fbe.am/sIf

有人对此进行了解释吗?!

2 个答案:

答案 0 :(得分:3)

使用默认打包规则(/ Zp8),该结构包含12个字节的填充以使成员对齐。哪个应该足以解释68和80之间的差异。你必须消除填充,在MSVC编译器中使用#pragma pack

#pragma pack(push, 1)
typedef struct {
   // .. etc
} WinHeaderType;
#pragma pack(pop)

答案 1 :(得分:0)

这很可能与两种情况下WORD的定义不同有关。 BYTE,WORD和ULONG不是本机C ++类型,因此请检查定义的位置/方式。

BYTE可能只是一个字符。 ULONG可能是无条件的长。 但在你的情况下,WORD可能有所不同。