神秘的sizeof(union和struct的区别)
2011-05-07 19:36
330 查看
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
struct B的内存空间如下:
| 4 |...| 4 | 4 | 4 | 4 | 4 |...|10->16|
{
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
struct B的内存空间如下:
| 4 |...| 4 | 4 | 4 | 4 | 4 |...|10->16|
相关文章推荐
- C语言中union与struct的区别及sizeof的计算方式
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- strlen与sizeof区别(转载)以及struct,union的sizeof内存对齐等问题
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- 面试珠玑 C语言中union与struct的区别及sizeof的计算方式
- 联合体(union)和结构体(struct)的区别
- 大端小端区别、Union和Struct的内存分配
- union, struct, enum 的 大小区别
- struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- struct、union、enum and sizeof
- struct union enum的区别
- struct和union结构体和联合体的区别
- C语言sizeof(struct)与sizeof(union)
- struct和 union用 sizeof 看字节对齐
- struct class union的区别
- sizeof(struct)与sizeof(union)
- struct和union的区别