字节对齐

Intel、微软等公司曾经出过一道类似的面试题:
#include
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack()
int main(int argc, char* argv[])
{
example2 struct2;
cout << sizeof(example1) << endl;
cout << sizeof(example2) << endl;
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;
return 0;
}
问程序的输入结果是什么?
答案是:
8
16
4


  面试题的解答
至此,我们可以对Intel、微软的面试题进行全面的解答。
程序中第2 行#pragma pack (8)虽然指定了对界为8,但是由于struct example1 中的成员最大
size 为4(long 变量size 为4),故struct example1 仍然按4 字节对界,struct example1 的size
为8,即第18 行的输出结果;
struct example2 中包含了struct example1,其本身包含的简单数据成员的最大size 为2(short
变量e),但是因为其包含了struct example1,而struct example1 中的最大成员size 为4,struct
example2 也应以4 对界,#pragma pack (8)中指定的对界对struct example2 也不起作用,故19 行的
输出结果为16;
由于struct example2 中的成员以4 为单位对界,故其char 变量c 后应补充3 个空,其后才是
成员struct1 的内存空间,20 行的输出结果为4。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值