为什么Struct填充在64位和32位系统中是相同的



花了很多时间在互联网上寻找答案,但我一无所获。

我的问题是:我有一个64位系统,当我运行这个代码时:

#include<iostream>
using std::cout;
class A
{
char a ; //1
char b ; //1
int c;   //4
int d;   //4
};
int main()
{
A a1;
cout<<sizeof(a1);
return 0;
}

输出是12,而不是16。为什么?

在使用的系统中,sizeof( int )等于4。因此,为了对齐数据成员c,编译器在变量b之后填充2字节。因此,该结构的大小为12个字节。

如果声明类型为long的数据成员cd,则根据使用的是32还是64位系统,可以获得更可见的结果。在大多数64 nit系统中,sizeof( long )等于8

当需要在结构或类的数据成员之间添加填充字节以满足这些数据成员中任何一个的对齐要求,或者(更一般地(优化对这些成员的访问速度时,会在这些数据成员之间加上填充字节。

现在,虽然int等类型的对齐要求不是由C++标准指定的,并且对于同一底层芯片(如Intel x86-64系统(,在32位和64位构建之间可以变化(或不变化(,但char类型(以及signed charunsigned char(的对齐要求是由标准指定的!来自cppreference:

最弱的对齐(最小的对齐要求(是charsigned charunsigned char的排列,等于1;这个任何类型中最大的基本对齐是由实现定义的并且等于CCD_ 20的排列(由于C++11(。

因此,由于b成员的对齐要求为1,因此ab之间不需要填充。在您的情况下,int的对齐要求是4个字节,因此必须在c成员之前添加两个填充字节。因此,2×sizeof(char)(=2(+2个填充字节+2×sizeof(int)(=8(给出了12个字节的总大小。

最新更新