5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

再帖 几道面试题(据说是INTEL公司的)

楼主zdl1016(【不要给我分,以免影响我性欲】)2006-08-25 19:07:45 在 C/C++ / C++ 语言 提问

1\   编译中的问题:全局变量如int   i=5;   int*(pf)()=foo;   分别在何时被初始化?设计时候如何具体的实现。  
  2\   解释例如mov   ax,100H   这样一条指令的cpu,   os,   memory等都完成了什么样的工作。  
  3\   Strlen()的C语言实现,不能使用任何变量。  
  4\   C语言参数的入栈顺序?为什么这么实现?  
  5\   C语言中字符串的翻转,最高效率(时间和空间)的实现?  
  6\   4.   某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统  
  (300M的CPU,50M的SDRAM)中运行,还需要优化吗?  
  7   \有两个线程  
  void   producer()  
  {  
  while(1)  
  {  
  GeneratePacket();  
  PutPacketIntoBuffer();  
  Signal(customer);  
  }  
  }  
  void   customer()  
  {  
  while(1)  
  {  
  WaitForSignal();  
  if(PacketInBuffer>10)  
  {  
  ReadAllPackets();  
  ProcessPackets();  
  }  
  }  
  }  
  (1)有没有其他方法可以提高程序的性能  
  (2)可不可以不使用信号之类的机制来实现上述的功能  
   
  大家挑着答吧 问题点数:20、回复次数:36Top

1 楼zhjg136(天星)回复于 2006-08-25 19:19:09 得分 1

沙发~Top

2 楼zenny_chen(ACE Intercessor)回复于 2006-08-25 21:12:41 得分 3

1、int   i   =   5;在编译时初始化;int   (*fp)(void)   =   &foo;在连接时初始化。  
   
  3、  
  size_t   strlen(const   char   *s)  
  {  
  if(!s)  
  return   -1;  
  return   (*s)?   1   +   strlen(++s)   :   0;  
  }  
   
  4、参数从右往左依次压入堆栈。  
  Top

3 楼OOPhaisky(异化$渴望成功~~)回复于 2006-08-25 21:31:59 得分 0

intel的东西真是够底层的。Top

4 楼zenny_chen(ACE Intercessor)回复于 2006-08-25 21:33:28 得分 3

6、需要。因为对于嵌入式系统,优化往往是指令集层的。如果另一个系统提供了更高效的指令集系统(如超标量、多核等),那么还是有很大可能对原来系统进行进一步优化的,并且该优化是值得的。  
   
  7、有。可以不使用semaphore等通信原语来完成该实现,不过还是要看customer运行的优先级等。  
   
   
  Top

5 楼i_noname(晚九朝五)回复于 2006-08-25 21:43:09 得分 0

现在想入intel可以死心了,intel的招聘计划已经freezing好几个月了,裁员行动还在继续...Top

6 楼sabcdefg(胖胖)回复于 2006-08-25 22:36:38 得分 0

markTop

7 楼colcn88((散花)只想让家里人过得更好)回复于 2006-08-25 23:45:02 得分 0

看Top

8 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2006-08-26 09:04:33 得分 3

4\   C语言参数的入栈顺序?为什么这么实现?  
  应该是从右向左的入栈顺序。因为C语言支持变参数函数,例如wsprintf(),   在编译的时候函数并不能确定参数的个数,所以函数不能完成"栈清空"的操作.Top

9 楼zdl1016(【不要给我分,以免影响我性欲】)回复于 2006-08-26 09:31:24 得分 0

to   houdy(致力于图像/图形领域,成为有思想的程序员)  
   
  对第4题的解答我不太明白,能解释得更详细点吗?Top

10 楼petertangpei(双腿夹着灵魂赶路)回复于 2006-08-26 10:46:18 得分 0

MARKTop

11 楼zenny_chen(ACE Intercessor)回复于 2006-08-26 15:19:12 得分 2

To   楼主:  
   
  其实这很好理解。  
   
  参数从左往右依次压栈对于被调用的函数来说,对实参的处理将变得非常容易。  
   
  调用者(Caller)将参数从右往左压栈,那么对于最左边的函数,即第一个参数是在栈顶。那么被调用的函数(Callee)就可以直接用bp去取该参数,bp+4则指向第二个实参,依此类推。这是C调用协定。这样做的好处还有就是可以处理不定参数个数的函数调用,如:int   printf(const   char*,   ...);  
   
  下面举个例子:  
   
  int   sum(int   a,   int   b,   int   c)  
  {  
  return   a   +   b   +   c;  
  }  
   
   
  void   main(void)  
  {  
  cout   <<   "The   value   is:   "   <<   sum(1,   2,   3)   <<   endl;  
  }  
   
  在main()函数中调用了sum,VC++.NET2003的处理为:  
   
  main:  
   
  cout   <<   "The   value   is:   "   <<   sum(1,   2,   3)   <<   endl;  
  0041B26E     push                 offset   std::endl   (4194BFh)    
  0041B273     push                 3                                 //   压第三个参数  
  0041B275     push                 2                                 //   压第二个参数  
  0041B277     push                 1                                 //   压第一个参数  
  0041B279     call                 sum   (419A82h)         //   调用sum函数  
   
  //////////////////////////////////////////////////////////////////////  
   
  0041B27E     add                   esp,0Ch    
  0041B281     push                 eax      
  0041B282     push                 offset   string   "The   value   is:   "   (44F0C8h)    
  0041B287     push                 offset   std::cout   (458688h)    
  0041B28C     call                 std::operator<<<std::char_traits<char>   >   (419AB4h)    
  0041B291     add                   esp,8    
  0041B294     mov                   ecx,eax    
  0041B296     call                 std::basic_ostream<char,std::char_traits<char>   >::operator<<   (4195E1h)    
  0041B29B     mov                   ecx,eax    
  0041B29D     call                 std::basic_ostream<char,std::char_traits<char>   >::operator<<   (419AE1h)    
  ////////////////////////////////////////////////////////////////////////////  
   
  sum:  
   
  int   sum(int   a,   int   b,   int   c)  
  {  
  0041B210     push                 ebp      
  0041B211     mov                   ebp,esp    
  0041B213     sub                   esp,0C0h    
  0041B219     push                 ebx      
  0041B21A     push                 esi      
  0041B21B     push                 edi      
  0041B21C     lea                   edi,[ebp-0C0h]    
  0041B222     mov                   ecx,30h    
  0041B227     mov                   eax,0CCCCCCCCh    
  0041B22C     rep   stos         dword   ptr   [edi]    
  return   a   +   b   +   c;  
  0041B22E     mov                   eax,dword   ptr   [a]                 //   a   =   bp   +   8  
  0041B231     add                   eax,dword   ptr   [b]                 //   b   =   bp   +   12  
  0041B234     add                   eax,dword   ptr   [c]                 //   c   =   bp   +   16  
                                                                                                //   eax作为返回值  
  }  
   
  Top

12 楼zdl1016(【不要给我分,以免影响我性欲】)回复于 2006-08-26 16:14:29 得分 0

哇噻,谢谢楼上,懂了,全懂了..  
  zenny_chen(ACE   Intercessor)Top

13 楼ilovechao1314(有点晕了)回复于 2006-08-26 16:31:50 得分 0

markTop

14 楼universee(吾乃太极语言之父)回复于 2006-08-26 16:49:02 得分 0

 
  这个呢?  
  5\   C语言中字符串的翻转,最高效率(时间和空间)的实现?  
  Top

15 楼zdl1016(【不要给我分,以免影响我性欲】)回复于 2006-08-26 17:56:08 得分 0

还有几个问题没搞定,大家加油呀Top

16 楼property1(lubiao)回复于 2006-08-26 21:48:58 得分 1

6   int   StrLen(char*   p)  
              7   {  
              8           if   (*p   ==   '\0')  
              9                   return   0;  
            10           return   StrLen(p+1)   +   1;  
            11   }  
  Top

17 楼lingboli(凌波丽)回复于 2006-08-26 22:20:56 得分 0

都是高手啊,学习学习...Top

18 楼zenny_chen(ACE Intercessor)回复于 2006-08-26 22:53:10 得分 2

5、可能还不算最高:  
   
  #include   <assert.h>  
   
   
  void   reverse_string(char   *dest,   const   char   *src)  
  {  
  const   char   *temp   =   src   -   1;  
   
  assert(dest   &&   src);  
   
  while(*src++);  
   
  src   -=   2;  
   
  while(src   !=   temp)  
  *dest++   =   *src--;  
   
  *dest   =   '\0';  
  }Top

19 楼wshuangminlg(这里有你想要的 http://31767702.qzone.qq.com/)回复于 2006-08-26 23:44:00 得分 0

ASP。NET   2.0   新技术讨论群:20810637(群主)Top

20 楼jaycsu(jaycsu)回复于 2006-08-27 00:10:22 得分 0

mark  
  Top

21 楼wanghi(海海)回复于 2006-08-27 10:22:40 得分 0

markTop

22 楼kingtoo010()回复于 2006-08-27 10:44:59 得分 0

帮顶..接分...  
  ------------------------------------------------------------------------------------  
  100M.Net空间+50M企业邮局=60元/年  
  100M.Net空间+国际顶级域名=100元/年  
  国际顶级域名.com.net.cn=50元/年  
  本站申请域名可绑定免费10M   Asp.Net空间  
  1000M.Net空间   +   100M   MsSql数据库   +   1000M企业邮局   +   顶级域名=600元/年  
  数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售  
  还有很多优惠套餐提供给各个用户层.  
  有意者可联系电话:021-64802212   传真:021-64802212    
  咨询信箱:info@kingtoo.com   咨询OICQ:68311305,379620139   81778640Top

23 楼yifeng123(Bater Late Than Never)回复于 2006-08-27 12:04:15 得分 1

mov   ax   ,100h  
  首先os从mem中取出指令,解释后,由cpu把100h存入axTop

24 楼zenny_chen(ACE Intercessor)回复于 2006-08-27 15:19:32 得分 2

To   yifeng123(Bater   Late   Than   Never)   :  
   
  指令是由操作系统取的吗?那么CPU做什么事啊?  
  解释是指什么?  
   
  只能说操作系统在系统态或用户态去执行该指令。在执行该指令过程中由CPU去取指令,执行指令功能。Top

25 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2006-08-27 15:32:18 得分 0

size_t   strlen(const   char   *s)  
  {  
  if(!s)  
  return   -1;  
  return   (*s)?   1   +   strlen(++s)   :   0;  
  }  
   
   
  用递归来实现,真是聪明呀Top

26 楼laiwusheng(风清扬)回复于 2006-08-27 16:12:14 得分 0

markTop

27 楼tomtom123(abc)回复于 2006-08-27 17:36:08 得分 0

size_t   strlen(const   char   *s)  
  {  
  if(!s)  
  return   -1;  
  return   (*s)?   1   +   strlen(++s)   :   0;  
  }  
   
  ======  
   
  UPTop

28 楼songlife33(美女,偶们结婚吧)回复于 2006-08-28 09:11:15 得分 1

建议  
  zenny_chen(ACE   Intercessor)  
  成立我们中国的intel公司,嘿嘿,厉害Top

29 楼zenny_chen(ACE Intercessor)回复于 2006-08-28 20:34:32 得分 0

呵呵,还差远了。  
   
  Intel以芯片设计为其特色,在这方面,我只能跟着它的编程手册走。Top

30 楼hot305(hot305)回复于 2006-08-29 09:55:08 得分 0

好好学习Top

31 楼zdl1016(【不要给我分,以免影响我性欲】)回复于 2006-08-29 10:16:10 得分 0

帖子快到结了时候了   问题还没有全部搞定..不过也差不多了...Top

32 楼wb19822002()回复于 2006-08-29 11:08:34 得分 1

"初始化"只能说是在加载时、还是运行时,不能说编译时还是连接时吧Top

33 楼kagomelee(卡通fans)回复于 2006-09-07 09:07:35 得分 0

markTop

34 楼Golfen()回复于 2006-09-12 12:10:24 得分 0

第7题:  
  1.可以提高,让producer产生10个package再notify   customer  
  2.可以用一个glaobal   variable,但是效率不高Top

35 楼brouse130()回复于 2006-11-05 17:52:02 得分 0

顶!!!!!Top

36 楼Fantasy_mysky()回复于 2006-11-13 19:32:13 得分 0

新手学习ing...Top

相关问题

关键词

得分解答快速导航

  • 帖主:zdl1016
  • zhjg136
  • zenny_chen
  • zenny_chen
  • houdy
  • zenny_chen
  • property1
  • zenny_chen
  • yifeng123
  • zenny_chen
  • songlife33
  • wb19822002

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问