sizeof计算结构体大小的时候具体是怎样计算的
内存对齐的原则是根据最宽数据类型的大小进行对齐的
struct A
{
char a; 1+1
short b; 2
int c; 4
};
大小是8个字节
要进行内存对齐,是根据int -> 4个字节对齐的
|char|---|short | 4字节
|------int------| 4字节
如上是这样对齐的
struct A
{
int a; 4
char b; 1+1
short c; 2
};
大小是8个字节
|------int------| 4字节
|char|---|short | 4字节
struct A
{
char a; 1+1
short b; 2
short c; 2+2
int d; 4
};
大小是12个字节
|char|---|short | 4字节
| short | ------|4字节
|------int------| 4字节
struct A
{
char a; 1+1
short b; 2+4
double c; 8
char d; 1+3
int e; 4
int f; 4
char g; 1+3
short h; 2+2
int I; 4
short j; 2
char K; 1+1
short L; 2+2
};
大小为48个字节
来一个究极长的
|char|---|short |---------| 8字节
| double | 8字节
|char|---------| int | 8字节
| int |char|---------| 8字节
| short |------| int | 8字节
| short |char|----| short |-----| 8字节
typedef struct A
{
char a;
short b;
int c;
}A;
typedef struct B
{
char a; 1+2
short b; 2
A c; 8
short d; 2+2
}B;
结构体B的大小为16
以结构体中最长的int数据类型的大小进行内存对齐
typedef struct A
{
int a;
short b;
static int c;
}A;
大小为8字节
这个结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:
|--------int--------| 4字节
|--short-|----|---- | 4字节
struct A
{
};
一个空结构体中,在c中大小为0,c++中大小为1