sizeof union和struct

转自http://www.51testing.com/?uid-165588-action-viewspace-itemid-76679

union A
{
int a[5];
char b;
double c;
};

struct B
{
int n;
A a;
char c[10];
}

sizeof(B) = ?

答案:

union A:
{
int a[5]; //20
char b; //1
double c; //8
}

我想的是union中变量共用内存,应以最长的为准,那就是20。可实际不然,sizeof(A)=24,

A中各变量的默认内存对齐方式,必须以最长的double 8字节对齐,故应该是sizeof(A)=24。

struct B
{
int n; // 4字节
A a; // 24字节
char c[10]; // 10字节
};
实际占用38字节,但由于A是8字节对齐的,所以int n和char c[10]也需要8字节对齐,总共8+24+16=48  

内存对齐主要目的是提升读取数据的速度,通过保证 类型数据(n字节)保存在n倍数的内存

地址上。(n越大,要求越严格。)
要做到这点,有3个位置要求。
首地址,调到最严格地址倍数上,不影响大小。
中间项,按各自下一项的地址要求填充调整,影响大小。
最后一项,通过填充,达到最严格地址大小倍数,影响大小。
union A
{
int a[5];
char b;
double c;
};
对于union A(共享内存),其实只有一项
至少需要20字节。首地址可以解释为3种类型,
A =a时,
| 4 | 4 | 4 | 4 | 4 | ,20字节
中间和尾部都不需调整。
A =b时,
|1|.................|,
中间和尾部都不需调整,20字节。
A =c时,
| 8 |...........|,
c作为最后项,需要调整20-〉24
因此,内存布局:
| 4 | 4 | 4 | 4 | 4 |...| (...为padding),total=24

struct B
{
int n;
A a;
char c[10];
};
这里要注意a,是作为A类型,是一项数据。
对于 struct B,最严格8字节,
首地址为8的倍数,填入n,(后面空4个字节,因为a的开始地址要求8的倍数)
c,开始地址无特殊要求,a后面无需填充,
作为尾项,c,10-〉16
| 4 |...| 4 | 4 | 4 | 4 | 4 |...|10->16|

to kimiya25:
struct C{
int n;
char c[10];
union {
int a[5];
char b;
double c;
} u_a;
};
n: 4
c: 10->12
u_a: 24
| 4 | 10 |...| 24 |
//----------------------------------
效率的解释:例处理器每次从内存读入8个字节的数据,当我们需要一个double类型的数据

时,通过在写入内存时改保证数据写在8倍数的地址上,就能够只用一次读,否则可能跨越

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值