64位系统中struct的内存分配

64位系统中struct的内存分配,c,memory,struct,64-bit,padding,C,Memory,Struct,64 Bit,Padding,我在查看旧的示例时发现了这个问题,在64位操作系统上,我必须输入这个特定结构的字段大小和填充大小: struct mystruct { char a; uint32_t b; int16_t c; int64_t d; }; 答案是: struct mystruct { char a; //field size: 1, padding size: 3 uint32_t b; //field size: 4, padding size: 0

我在查看旧的示例时发现了这个问题,在64位操作系统上,我必须输入这个特定结构的字段大小和填充大小:

struct mystruct {
    char a;
    uint32_t b;
    int16_t c;
    int64_t d;
};
答案是:

struct mystruct {
    char a;     //field size: 1, padding size: 3
    uint32_t b; //field size: 4, padding size: 0
    int16_t c;  //field size: 2, padding size: 6
    int64_t d;  //field size: 8, padding size: 0
};
我确实理解为什么
int16\t
由于64位体系结构而被分配2个字节和6个填充。与
int64\t
相同

但是为什么
char
为64位体系结构分配了3个填充大小,而
uint32\u t
为4个字段大小

struct mystruct {
    char a;     //field size: 1, padding size: 3
    uint32_t b; //field size: 4, padding size: 0
    int16_t c;  //field size: 2, padding size: 6
    int64_t d;  //field size: 8, padding size: 0
};
我明白为什么int16_t分配了2个字节和6个填充, 因为64位体系结构。与int64\t相同。但是,为什么是 分配了填充大小为3的字符和字段大小为4的uint32\t 什么时候是64位体系结构

struct mystruct {
    char a;     //field size: 1, padding size: 3
    uint32_t b; //field size: 4, padding size: 0
    int16_t c;  //field size: 2, padding size: 6
    int64_t d;  //field size: 8, padding size: 0
};
因为:

  • char
    将从任何偏移量开始

  • unit32\t
    将从偏移量
    mod(4)=0开始

  • int16\u t
    将从偏移量
    mod(2)==0开始

  • int64\u t
    将从偏移量
    模式(8)=0开始

因此


这是强编译器和ABI特定的。不可能有一个普遍的答案!Windows/x86-64和Linux/PowerPC上的情况可能会有所不同(即使您使用了一些编译器)。一些编译器甚至在一些优化过程中重新排列了
struct
成员。
我确实理解为什么int16\t分配了2个字节和6个填充,因为64位体系结构
——这不是因为64位体系结构。这是因为
d
int64\u t
,必须在8字节边界对齐,因此必须在
c
中添加6的填充。如果
d
int32\t d,然后
c
将具有字段大小:2,填充大小:2。好的,在讲座中,我们一直使用linux,我想除了编译器认识到“拆分”第一个64位地址以适应char和uint32\t的可能性之外,没有什么像重新排列这样的优化。@GSerg哦,好的,这是有意义的!可能会有帮助。