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;
}
2、printf()可变参数如何实现 ,http://www.vckbase.com/document/viewdoc/?id=1830
int printf(char *fmt, ...),关键是几个宏的实现
3、标准模板库vector追加数据如何实现。是底层如何实现,不能用现有的东东。
在追加对象前先判断预留的空间是否满足需求,如果不满足则根据分配策略,另分配足够的空间 (一般使用平方增加策略),复制以前的对象数组,再释放原来的空间,然后把对象追加到尾部。如果任何一个操作环节失败,则至少保留原数组不受影响(异常安全保证策略)。
4、java的垃圾收集机制如何实现为什么?如果是你自己实现垃圾收集机制,如何实现? 用什么数据结构?
垃圾收集没有统一的实现。《深入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;
10、c与c++ static函数的区别???
C 语言中 static 关键字作用于函数时起限制函数作用域的作用,其static函数作用域被限制为当前文件中,该函数定义之后部分。
C++ 的全局函数用static 修饰和 C 语言中一个意思 (C++ 标准建议此种情况用匿名名字空间包含该函数来代替static关键字);但类成员函数如果用static 修饰表示是类的作用域而不是对象作用域,可以直接通过类名来引用。
11、const 函数的作用,如何实现钩子函数。
类的设计者通过将函数声明为 const 以表明它们不修改类对象。
const 函数内不允许修改数据成员 (需要注意的是,虽然在 const 函数内,指针成员变量不允许被修改,但对指针所指向内容的修改是允许的)。
一个 const 类对象只能调用 const 成员函数 (构造和析构函数除外)。
12、两层容错技术怎么实现?
13、写出函数指针,函数返回指针,const指针,指向const的指针,指向const的const指针。
函数指针:函数类型 (*指针变量名)(形参表) --int (*f)(int a);
--1.说明函数指针变量(int(*f)(int a));2.要对函数指针变量赋值(f = func);3.要用(*指针变量)(参数表);调用函数((*f)(a,b))
指针函数:类型标识符 *函数名(参数表) int * f(int x, int y)
Const 指针:int *const ptr
指向const的指针:const int *ptr
指向const的const指针: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)。