花了很多时间在互联网上寻找答案,但我一无所获。
我的问题是:我有一个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
的数据成员c
和d
,则根据使用的是32
还是64
位系统,可以获得更可见的结果。在大多数64 nit系统中,sizeof( long )
等于8
。
当需要在结构或类的数据成员之间添加填充字节以满足这些数据成员中任何一个的对齐要求,或者(更一般地(优化对这些成员的访问速度时,会在这些数据成员之间加上填充字节。
现在,虽然int
等类型的对齐要求不是由C++标准指定的,并且对于同一底层芯片(如Intel x86-64系统(,在32位和64位构建之间可以变化(或不变化(,但char
类型(以及signed char
和unsigned char
(的对齐要求是由标准指定的!来自cppreference:
最弱的对齐(最小的对齐要求(是
char
、signed char
和unsigned char
的排列,等于1;这个任何类型中最大的基本对齐是由实现定义的并且等于CCD_ 20的排列(由于C++11(。
因此,由于b
成员的对齐要求为1,因此a
和b
之间不需要填充。在您的情况下,int
的对齐要求是4个字节,因此必须在c
成员之前添加两个填充字节。因此,2×sizeof(char)
(=2(+2个填充字节+2×sizeof(int)
(=8(给出了12个字节的总大小。