微软一面试题-----字节对齐

wbgxx 2010-05-13 12:59:14
#include <iostream>
using namespace std;
#pragma pack(8)

struct example1
{
short a;
long b;
};

struct example2
{
char c;
example1 struct1;
short e;
};

#pragma pack()

int main()
{
example2 struct2;
cout << sizeof(example1) << endl; //8
cout << sizeof(example2) << endl; //16
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
<< endl; //这里为啥是4啊???能详细说说吗?????、

getchar();
}
...全文
502 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lnuyasha_hrb 2010-05-16
  • 打赏
  • 举报
回复
呵呵 不管是什么 遇到问题 然后解决问题 学到了 就好
嘎文 2010-05-16
  • 打赏
  • 举报
回复
要强调的是这里4并不表示4个字节,而是4个unsigned int的偏移量,也就是4*4 = 16个自己
Yanger_xy 2010-05-16
  • 打赏
  • 举报
回复
不懂...
wbgxx 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taodm 的回复:]

哎,连个提问都不诚实,这编程怎么能学好。
[/Quote]

咋啦?这真的是微软的面试题啊,难道我欺骗大家不成
ericming200409 2010-05-13
  • 打赏
  • 举报
回复
内存对齐,变量起始地址和结束地址必须是所占空间的整数倍
hallowwar 2010-05-13
  • 打赏
  • 举报
回复
呵呵,温故而知新。
GoForSky 2010-05-13
  • 打赏
  • 举报
回复

网搜,大片详细的讲解!!!
常见问题
dadun 2010-05-13
  • 打赏
  • 举报
回复
看了,基本明白了。。。。谢谢!
kiteboy1 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hallowwar 的回复:]
呵呵,温故而知新。
[/Quote]
+1
lnuyasha_hrb 2010-05-13
  • 打赏
  • 举报
回复
1.成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
2.S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,按4字节对齐,所以sizeof(S1)应该为8;
3.S2中,c和S1中的a一样,按1字节对齐,对于S2偏移为0,而d 是个结构,它是8个字节,但是对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4字节.所以,成员d就是按4字节对齐.成员e是4个字节,它是4字节对齐,所以成员最大的字节是4个字节,按4字节对齐S1相对S2的偏移量就为4,S2一共使用了24个字节.
etgqqw 2010-05-13
  • 打赏
  • 举报
回复
被8阴到了...
  • 打赏
  • 举报
回复
ithiker 2010-05-13
  • 打赏
  • 举报
回复
参考下这个:
http://blog.csdn.net/jcwKyl/archive/2010/03/08/5356294.aspx
selooloo 2010-05-13
  • 打赏
  • 举报
回复
struct example2
{
char c;
example1 struct1;//这里是将example打散看的,最宽简单类型成员是int,偏移量是4
short e;
};
偏移量还要考虑 #pragma pack(8)
#pragma pack是调整结构体对齐方式的,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准

我们计算出来的偏移量是4比8小,所以这里#pragma pack(8)没起到作用
如果改成这样#pragma pack(2),再计算,结果就会是2了
taodm 2010-05-13
  • 打赏
  • 举报
回复
哎,连个提问都不诚实,这编程怎么能学好。
cattycat 2010-05-13
  • 打赏
  • 举报
回复
就是example2的struct1成员离结构体开始的偏移量,就是4了。
这个不是微软的吧。
jamseyang 2010-05-13
  • 打赏
  • 举报
回复
唉。。。
[Quote=引用 4 楼 taodm 的回复:]
哎,连个提问都不诚实,这编程怎么能学好。
[/Quote]
Julykey 2010-05-13
  • 打赏
  • 举报
回复
按长的来计算,这里以long为标准
patricxuqi 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hairetz 的回复:]
看完我以前写的这篇吧。

http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx
[/Quote]
拜读一下呵呵。
oscarswq 2010-05-13
  • 打赏
  • 举报
回复
因为cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
<< endl;
是进行了地址的偏移计算,(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
的意思是用结构体struct2中得struct1的存储地址 - 结构体struct2的首地址,即结构体struct1在结构体struct2中的偏移地址,由于结构体中的数据是按顺序存放的,所以struct1在结构体struct2中中的偏移地址是4。
如果这里改成cout << (unsigned int)(&struct2.c) - (unsigned int)(&struct2)
<< endl;的话就是0.
改成cout << (unsigned int)(&struct2.e) - (unsigned int)(&struct2)
<< endl;的话就是12
加载更多回复(1)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧