由一次面试经历,闲谈C++内存对其问题!顺便对面试官们说几句 - 挨踢职涯 / 求职面试

来源:百度文库 编辑:神马文学网 时间:2024/06/03 08:15:27
前一段时间去一家小公司面试,面试官居然一个毛头小子,估计刚刚毕业三四年。而我已经而立之年,工作快8年了。


他给出这样一道题目:
//==============================
32位系统下,有如下定义:
typedef struct _AAA

  char b; 
  double a; 
  char c; 
}AAA; 

问:sizeof(AAA)的值为多少。
//==============================

题外话:
这种题目,至少八成的软件公司面试题里都会出现,对此感到很奇怪。我知道他们是想考察对“内存对齐”的理解。但是做一般的程序根本不必理会这些东西;有多少程序需要自己去考虑内存对齐问题呢?真的这样去做只怕弄巧成拙!因此这种题目实际意义不大。

另外,通过#pragma pack(n) 这样的命令是可以改变对齐情况的。受此影响sizeof(AAA)的值也会发生改变。在毫无说明的情况下,直接问sizeof(AAA)的值为多少,岂不荒谬?因此这种题目没有上下文的情况下,是无法回答的。


话说回来。
我想应该是默认情况下的,于是回答是16.


那个面试官沉默了一下, 然后很不客气地对我说:你这么多年程序怎么写的?我们这边刚刚工作的新人都知道这是 24!
面试很快结束的,而且有点不愉快。



2002年我刚毕业找工作的时候,做过类似的题目。在学校都是使用Turbo C 2.0 写程序,那时对于结构体大小的经验是:所有成员大小相加。所以那是对于这种题目答案是10.这个答案理所当然被高高在上的面试官鄙视了!

后来我查阅资料才知道有内存对齐这回事。但我一直记得32位系统是以4字节作为对齐单位的。所以我的这次答案是16. 结果又被人家以24这个“标准答案”给鄙视了!对这个结果我是不服的!毕竟自己研究过这种东西。


我知道随着年龄的增加,自己的记忆力不如以前了。但还不至于老年痴呆,自己做过的东西还是记忆很清楚的。



于是回到家第一件事情就是上网查资料。想知道:32位系统究竟是以几个字节作为对齐单位。网上帖子似乎都说是8字节,这也是sizeof(AAA)等于24的原因。

我还是不服,打开VS2005 写了一个程序试试, 结果真的是24!

我很沮丧,打开MSDN Library for Visual Studio 2005 查阅(ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vclang/html/e4209cbb-5437-4b53-b3fe-ac264501d404.htm)结果上面也说以8字节对齐。


再用 vc 6.0 和 Borland C++ 5.5 这些相对比较老的编译器试了试。结果都是sizeof(AAA)==24.

又装上MinGW-3.4.2 结果又是sizeof(AAA)==24. 


真是岁月不饶人,我开始怀疑自己是不是真的记错了。


怀疑自己曾经成绩和经验是一件让人难过的事情。此时此刻,一股股“长江后浪推前浪,前浪死在沙滩上”的苍凉感油然而生。


几天后的我俄然打开装着 Radhat 8的虚拟机。由于心中的结还没有解开,于是在上面又测试了一次,结果sizeof(AAA)==16!!!!!!

“靠”!我似乎中了大奖一样,大声叫了一声;把我老婆孩子吓一跳。


冷静下来仔细思量了一下,最终觉得:内存默认对齐的字节数与操作系有关,而与编译器无关(注意:TC 2.0不直接工作在Windows上,别拿他来反驳我)。随便说一句,我现在用的操作系统是 Win XP SP2 ,2002年刚毕业那会我在Win 2000 .

疑问:
Win 2000 + VC6 下 sizeof(AAA) 等于多少 ??
Win 98 + VC6 下 sizeof(AAA)又等于多少 ??

我暂时不知道。但我知道:
RadHat8 + gcc 3.4.X 下 sizeof(AAA)==16 !!!!!!
WinXP SP2+VS2005 下 sizeof(AAA)==24 !!!!!!



高高在上面试官们:
麻烦你们同时测试完 这几种环境,再问人家 sizeof(AAA) 等于多少的问题!!!然后再麻烦你们想想这种题目有多大意义?!


那些年轻的面试官们:你们可以拿熟悉的东西去考别人,但不要因为别人回答不了而洋洋得意,更不要就此挖苦别人;别人同样有拿手的东西是你不懂的。