LoveSi

自处超然,处人蔼然,无事澄然,遇事斩然,得意淡然,失意泰然

常用链接

统计

最新评论

Moto笔试题目

1、智能指针

智能指针是存储指向动态分配(堆)对象指针的类, 用于生存期控制, 能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限,引用计数等,控制权转移等)。auto_ptr 即是一种常见的智能指针。
     
智能指针通常用类模板实现:
       template <class T>
       class smpoint
       {
          public:
              smpoint(T * p): _p(p){}
              T & operator * (){return *_p;}
              T * operator -> (){return _p;}
              ~smpoint(){delete _p;}
          private:
              T * _p;
        }

2printf()可变参数如何实现http://www.vckbase.com/document/viewdoc/?id=1830

 
int printf(char *fmt, ...),关键是几个宏的实现

3、标准模板库vector追加数据如何实现。是底层如何实现,不能用现有的东东。

在追加对象前先判断预留的空间是否满足需求,如果不满足则根据分配策略,另分配足够的空间 (一般使用平方增加策略),复制以前的对象数组,再释放原来的空间,然后把对象追加到尾部。如果任何一个操作环节失败,则至少保留原数组不受影响(异常安全保证策略)。

4java的垃圾收集机制如何实现为什么?如果是你自己实现垃圾收集机制,如何实现? 用什么数据结构?

垃圾收集没有统一的实现。《深入Java虚拟机》中提了几种算法,包括引用计数,跟踪收集,拷贝收集(这个挺有趣的),还有重头火车算法。但是这本书有点旧了,新的技术不清楚。
最简单的实现做法,莫过于new的时候纪录,程序exit的时候批量delete……

5.二叉排序树和哈希表那个查找效率高,实用于pda

质量精良的hash肯定是查找效率最高的。但是pda上,应该是二叉树比较好吧。在内存限制的条件下,hash可能会有变态表现。而有序二叉树的查找算法就比较稳定,空间复杂度n,最坏时间复杂度nlog(n),而且避免了不同情况下hash函数的设计困难。

6.  .net的底层实现机制。

虚拟机
 

7、过程间通信如何实现。

windows用管道,unix用文件描述符,或者用socket
 

8、迭代问题,什么问题用迭代,迭代在操作系统中如何实现的

迭代算法是用电脑解决问题的一种基本方法。他利用电脑运算速度快、适合做重复性操作的特点,让电脑对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出他的一个新值。
递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

9、如何交换两个变量,不能用中间变量。

int   i;        
int   j;        
j   =  
i   +   j-   i   =   j);

a   =   a^b;
b=   a^b;
a   =   b^a;


10cc++ static函数的区别???

C 语言中 static 关键字作用于函数时起限制函数作用域的作用,其static函数作用域被限制为当前文件中,该函数定义之后部分。
C++
的全局函数用static 修饰和 C 语言中一个意思 (C++ 标准建议此种情况用匿名名字空间包含该函数来代替static关键字);但类成员函数如果用static 修饰表示是类的作用域而不是对象作用域,可以直接通过类名来引用。

11const 函数的作用,如何实现钩子函数。

类的设计者通过将函数声明为 const 以表明它们不修改类对象。
const
函数内不允许修改数据成员 (需要注意的是,虽然在 const 函数内,指针成员变量不允许被修改,但对指针所指向内容的修改是允许的)
一个 const 类对象只能调用 const 成员函数 (构造和析构函数除外)

12、两层容错技术怎么实现?

 

13、写出函数指针,函数返回指针,const指针,指向const的指针,指向constconst指针。

     函数指针:函数类型 *指针变量名)(形参表) --int *f)(int a);

      --1.说明函数指针变量(int*f)(int a));2.要对函数指针变量赋值(f = func);3.要用(*指针变量)(参数表);调用函数((*f)(ab))

      指针函数:类型标识符 *函数名(参数表) int * fint x int y

      Const 指针:int *const ptr

      指向const的指针:const int *ptr

      指向constconst指针:const int *const ptr

      

14、函数调用如何实现,注意什么问题。

在函数调用的时候,使用栈传递参数,可变参数函数的实现与函数调用的栈结构有关,正常情况下c/c++的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈。对于函数

 void fun(int a, int b, int c) {     int d;      ...    }

其栈结构为

    0x1ffc-->d

    0x2000-->a

    0x2004-->b

    0x2008-->c

对于任何编译器,每个栈单元的大小都是sizeof(int), 而函数的每个参数都至少要占一个栈单元大小

 

15、指针和引用的差别 

      1.指针初始化的时候,可以指向一个地址或者为空,而引用必须初始化为另一个变量;

      2.指针是一个变量,占用4个字节,引用是一个别名;指针可以指向NULL,但引用必须与一个已经存在的变量绑定,而且这种绑定不可修改。

      3.指针可以被重新赋值与指向另外一个不同的对象,但是引用则总是指向在初始化时被指定的对象,以后不能更改

 16、拷贝构造函数如何实现,什么情况下会用到。

   拷贝构造函数的几个用处:
      1)
用一个类对象初始化该类的另一个对象的时候:
         A a;
         A b(a);
         A b = a;
      2)
把一个类对象赋值给该类的另一个对象的时候:
         A b;
         b = a;
      3)
传参数和返回时:
         A f (A a) //
传参和返回都会调用拷贝构造函数
         {
             // ...
         }
     
实现时要注意的是:
      1)
当类中有指针变量成员时,确认是直接拷贝指针变量的值,还是重新分配内存然后递归拷贝构造。
      2)
是否有每个对象必须有唯一值的成员变量 (比如账号)。其实 1) 也可以归为 2)

 


 


posted on 2010-10-07 15:31 LoveSi 阅读(622) 评论(2)  编辑 收藏 引用 所属分类: 面/笔试

评论

# re: Moto笔试题目 2010-10-07 16:28 xiao xu

楼主写的很好啊 加油 再接再厉  回复  更多评论   

# re: Moto笔试题目 2010-10-07 19:26 LoveSi

@xiao xu
呵呵,刚刚开始看,有很多不会的,期待大家的指正!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理