1.volitale与register的常用用途
2.谈谈DLL 3.VC中的sendMessage与postMessage 4.堆和栈区别 5.指针与引用的区别 6.普通成员函数与虚函数的区别 7.class A{ ~virtual A{} } class B:public A{ ~ B{} } 为什么要把A类析构函数设为虚函数 8.快排思想,其不足之处,以及改进方法 9.huffman编码需要扫描一次还是两次文件,它与LZW编码的不同在哪 10.TCP/IP协议模型
1.volitale与register的常用用途
1 都是变量类型修饰符,第一个指这个变量是易变的,如果一个声明变量时在前面加上volitale,就意味着每次取值都从内存里取 第二个是寄存器,就是变量的值存储在寄存器中 volitale在非局部跳转的时候,在多线程的时候都会用到吧,防止编译器优化,数据在寄存器计算完成后立即写回内存,并且读取从内存读. register相反,它请求让该变量利用寄存器优化读取速度,但应该也只是个建议性的.
.volitale与register的常用用途
volitale >是不让编译在修改volitale所修饰的变量,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 register >例如:register char *p=(char *)malloc (sizeof (char)); p指向了一个唯一的地址;这个是为了提高数据的读取速度;但是所存储的数据被放在Cpu拥有的寄存器中,而非内存。 // 2.谈谈DLL 还木有怎么用过,DLL分为静态链接和动态链接,每个DLL都有和它一起存在的lib,静态链接用lib,动态链接用dll,编译DLL时要用extern "C"或者DEF保证函数名是神马神马的。DLL里的开辟的内存由DLL里的函数释放。 使用DLL程序更换DLL就可以完成更新。 3.VC中的sendMessage与postMessage PostMessage是将消息放到消息队列里,不一定立即处理。(异步的) SendMessage是消息立即被处理,处理完成后函数返回,(同步的) 4.堆和栈区别 栈向下增长,堆向上增长,栈是函数内的各种局部变量的存储区,堆是动态开辟内存的存储区。栈不大,堆还挺大的。 5.指针与引用的区别 指针可以赋值,引用只能初始化。 指针代表了地址,引用是变量的别名,必须初始化 6.普通成员函数与虚函数的区别
普通函数就是普通函数,虚函数可以动态绑定,由对象内的虚函数指针指向的虚函数表定位,虚函数是多态的基础。 虚函数为了动态绑定,也就是实现多态,当基类指针或引用指向派生类时,程序运行阶段就会使用派生类定义的函数
比如定义基类指针,如果析构函数不设为虚函数的话,那么调用的就是基类的析构函数,只是把派生类的基类子对象部分给释放了,但派生类剩下的部分没有释放,造成内存泄露。如果设为虚函数,那么调用时就会调用派生类的析构函数,这样整个派生类对象都被释放了。
8.快排思想,其不足之处,以及改进方法 快排思想就是将一个数n放到它在有序队列内应该在的位置,不足之处就是每一次partition可能都会出现1:n-1的最坏情况,导致快排效率是O(n^2)。 改进方法就是诸多算法书上的,3分取点法决定是用哪一个n(将n换到序列头部然后进行普通的partition)。也有用随机法选n的(效率也不行)。 快排思想:
通过选取枢纽元,把小于枢纽元的数排在左边,大于的排在右边,然后分别对左右两边递归调用。 不足之处: 枢纽元选取不当,会使程序表的很慢,甚至有可能退化到O(N^2)。一般的选取枢纽元的方法是 1.选第一个元素(不好,如果本来就是有序的,会是灾难性的) 2.随机选一个(不好,随机函数的开销也是不小的) 改进方法: 1.由于数组规模很小时,插入排序要快过快排,因此可以在数组过小时选用插入排序,而不用快排。(可以定为个数小于等于10个时)。 2.枢纽元的选取是关键,一种比较好的方法是:选取第一个,最后一个,和中间的一个,排序后选取中位数,作为枢纽元。 9.huffman编码需要扫描一次还是两次文件,它与LZW编码的不同在哪。 LZW是什么,huffman编码扫描一次统计字符频率,生成每个字符的编码,再扫描一次进行编码压缩。 LZW就是GIF图片用的压缩算法,原理也是查字典表。它的特点就是对于所有串,其前缀子串都必须在字典中存在。其最大的好处就是压缩时查表非常快,但是也牺牲了一些压缩性能。解压时它不比LZ系列算法快。
10.TCP/IP协议模型 物理,链路,网络,传输,应用。 |
|