为什么这个结构32的大小?

时间:2010-12-21 03:14:36

标签: c++

这是结构。

//Structure pour communiquer les paramètres de traitement à travers le MMF
struct params_traitement_mmf
{
    int brilliance;
    double contraste;
    char convolution[9];
};

这是我显示此结构大小的代码:

    char valeur[10];
    sprintf(valeur, "%d", sizeof(params_traitement_mmf));
    MessageBoxA(NULL, valeur, "rien", MB_OK);

MessageBox显示32。 谢谢!

5 个答案:

答案 0 :(得分:6)

packing是什么?并编译为什么平台? x86,AMD64和IA64之间的对齐要求不同。包装可能会对结构尺寸造成严重破坏。

假设默认打包(8)和AMD64目标(或x86,没有区别),brilliance有8个字节(4个字节大小,4个字节浪费),8个字节用于contraste然后是convolution的16个字节(9字节大小,浪费7个字节)。总计32,这似乎与你得到的一样。

答案 1 :(得分:2)

struct的最大(内存方面)成员是double,占用8个字节。默认情况下,struct会在最大的成员上对齐内存。由于char长度为9个字节,因此需要2x8个字节来存储它,即使只占用4个字节(在32位机器上)也需要8个字节。

4 - > 8 + 8 - > 8 + 9 - > 16 = 32字节。

答案 2 :(得分:2)

有效负载可能是21个字节(int = 4,double = 8,chars = 9),但是您的编译器在int和double之间添加填充以使双8字节对齐。最后还有一些填充,以确保即使结构放在一个数组中,double也是8字节对齐。

如果你改为定义,那么首先移动double:

struct params_traitement_mmf {
    double contraste;
    int brilliance;
    char convolution[9];
};

...很可能需要在int和double之间添加填充消失,sizeof(params_traitment_mmf)可能会降到24。

当然,在实践中发生的事情是特定于平台的。

答案 3 :(得分:1)

我的Mac将此列为仅24个字节。

int - 4 bytes
double - 8 bytes
char[9] - 12 bytes (padding)

Windows必须添加额外的填充才能正确对齐(也取决于您的处理器)。

答案 4 :(得分:1)

你得到了

int - 4 bytes
padding - 4 bytes (So the double is aligned)
double 8 - bytes
char array - 9 bytes
padding - 7 bytes

为什么填充到底?不确定,但假设你有一系列这些;你需要它为双字符串8字节对齐。