社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3105阅读
  • 1回复

Intel和微软同时出现的面试题

级别: 大掌柜
发帖
7343
铜板
6618
人品值
1388
贡献值
28
交易币
100
好评度
7488
信誉值
10
金币
0
所在楼道
学一楼
Intel和微软同时出现的C语言面试题 'l^Bb#)"  
  #pragma pack(8) 8S#$'2sT  
`;}`>!8j  
  struct s1{ A:(|"<lA  
  short a; Vbv^@Kp  
  long b; 89:nF#  
  }; cIwX sx  
w317]-n  
  struct s2{ rQ* w3F?:  
  char c; iXm&\.%  
  s1 d; ~k&b  
  long long e; I4N7wnBp  
  }; Jt5V{9:('  
<=n;5hv:  
  #pragma pack() bpBn3f`?*  
Z(6.e8fK  
  问 tAN!LI+w  
  1.sizeof(s2) = ? oUnb-,8n  
  2.s2的s1中的a后面空了几个字节接着是b? 9$$  Ijf  
#` 3Q4  
[nxYfER7  
&pzL}/u  
  如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考: )L9eLxI  
Trs~KcsD  
  网友rwxybh(行云)的答案: E'\gd7t ;  
  内存布局是 t[q2 W"#.  
  1*** 11** y7UU'k`  
  1111 **** tlQ6>v'  
  1111 1111 W]eILCo  
l!:bNMd  
  所以答案就是24和3 #k9&OS?  
[ ojL9.6  
  下面是一个测试的程序,试一试就知道了,我用的是VC2005 c(=>5  
&$|~",  
  #pragma pack(8) >;Hx<FKxP  
(X@\2M4@T#  
  struct s1{ legWY)4D;  
  short a; // 2 BYtes b~&cYk'  
  long b; // 4 Bytes .fzyA5@l  
  }; 7Y@]o=DIc  
  struct s2{ FL\pgbI  
  char c; // 1 Byte ` 1+*-g^r  
  s1 d; // 8 Bytes (m2%7f.I  
  long long e; // 8 Bytes 1SjVj9{:  
  }; q,ie)`  
  // 1*** 11** <2]h$53y!  
  // 1111 **** CCG 5:xS  
  // 1111 1111 fh`Y2s|:7R  
  // 6k0Awcr  
nX:E(9q7c  
  // 00 01 02 03 04 05 06 07 "}_ J"%  
  // 00 01 02 03 04 05 06 07  ="]r{  
  // 00 01 02 03 04 05 06 07 1L::Qu%E  
  // :.AC%'S  
  #pragma pack() 3Y#  
c<_1o!68  
  int main(int argc, char* argv[]) h i!K-_Uy  
  { *66EkCj  
  s2 a; kKF=%J?X  
  char *p = (char *)&a; /b # w.>e  
  for(int i=0;i<24;++i) k I`HD  
  p = (char)(i%8); I7Kgi3  
  printf("%d\n",sizeof(a)); 0z \KI?kd  
  printf("c=0x%lx\n",a.c); /ZiMD;4@y  
  printf("d.a=0x%x\n",a.d.a); 5P <"I["  
  printf("d.b=0x%x\n",a.d.b); &]a(5  
  printf("e=0x%llx\n",a.e); 8US35t:M  
  return 0; Gs"lmX-{$j  
  } FMCA~N  
  结果: W2XWb<QSEV  
  24 :a Cf@:']  
  c=0x0 9K}DmS  
  d.a=0x504 'E#L6,&  
  d.b=0x3020100 H 2I  
  e=0x706050403020100 x(u.(:V  
-}TP)/ !,*  
[cDDZ+6  
  网友 redleaves (ID最吊的网友)的答案和分析: B> E4,"  
7Q{&L#;  
  如果代码: 4wKCz Py  
  #pragma pack(8) Fb<'L5}i  
  struct S1{ 0(c,J$I]Z!  
  char a; &kd W(;`  
  long b; S".|j$  
  }; NUnwf h  
  struct S2 { 0* x ?rO?  
  char c; ^'N!k{x  
  struct S1 d; c)Q-yPMl)  
  long long e; kxe{HxM$Z  
  }; $R ze[3  
  #pragma pack() *RJD^hu  
  sizeof(S2)结果为24. A\mSS  
  成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.  XU"G  
  也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节. ^K`PYai  
*9KT@"v  
  S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; I@N/Y{y#  
  S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节. zLr:zfl  
  a b ~yN>9f U  
  S1的内存布局:11**,1111, eY Rd#w  
  c S1.a S1.b d Zu#^a|PE*  
  S2的内存布局:1***,11**,1111,****11111111 vKoQ!7g  
?a+J4Zr3  
  这里有三点很重要: [EPRBK`=  
  1.每个成员分别按自己的方式对齐,并能最小化长度 3J4OkwqD  
  2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 uAYDX<Ja9  
  3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 ,mp^t2  
Kv5 !cll5  
<aMihT)dd  
  网友xue23(xue23) 的答案和分析: A8nf"mRD:  
PVq y\i  
  有程序查一下各个变量的内存地址得知: c@O7,y:`I  
  各个变量在内存中的位置为 \ o?  
  c***aa** on\ahk, y]  
  bbbb**** >tkU+$;-  
  dddddddd S`spUq1o  
  测试代码为: 7bW ''J*6  
  s2 ss; SsL>K*t5  
  cout << "ss.c = " << &ss << endl ; L~M6 ca"  
  cout << "ss.d.a = " <<&ss.d.a << endl; (aq^\#9btO  
  cout << "ss.d.b = " <<&(ss.d.b) <  cout << "ss.d = " <<&ss.e << endl; a^L'-(  
  print out 各个变量的内存地址不就可以看出来了吗。 t2-bw6U  
!E/%Hv1  
  所以答案是24,2. oH [-fF  
{bp~_`O  
  但是我的想像中应该是这样的分布情况: OB+I.qlHP  
  c******* H?pWyc<,  
  aa**bbbb D7N` %A8   
  dddddddd :e4[isI  
j98>Jr\  
  不知为什么会c和a放在一起,组成8位长度。
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
级别: 经院小学
发帖
138
铜板
17050
人品值
97
贡献值
0
交易币
0
好评度
138
信誉值
0
金币
0
所在楼道

只看该作者 1 发表于: 2006-04-08
微软不会考这题目的^_^,微软看中的是idea.你可以去面一回,微软的题目很人性化,而这种分配内存的题目很少会考.^_^
描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五