这是结构。
//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。 谢谢!
答案 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字节对齐。