c++相关:对c++不是很了解,虽然学过,但是学得不是很好,使用更是很少。
1.inline函数
基本的形式:
inline int min(int first, int second)
关键字inline要与函数的定义放在一起才能成为内联函数:
函数的声明和定义的区别:
inline void Foo(int x);
inline void Foo(int x){ .... }
inline是"用于实现的关键字",不是用于生成的关键字。声明相当于对外接口,调用者并不需要了解,是否是内联实现。
定义在类中的成员函数自动成为内联函数。
class A { public: void Foo(int x, int y)//自动地成为内联函数 { ....... } };
如果内联函数中的代码过长或者有循环,那么不推荐是用内联函数。
使用内联函数的关键字不一定会在编译器中展开,编译器是有选择性的。
头文件中包含的inline函数的定义而非声明。
不可以不同的源文件中定义函数名相同但实现不同的inline函数,会发生冲突。
内联函数机制既具备宏代码的效率,又增加了安全性,并且可以自由的操作类中的数据成员。
宏代码的机制:#define 本身不是函数,但是使用起来像函数。编译预处理器用拷贝宏代码的方式取代函数调用,省去参数压栈,call调用,返回参数,return过程,提高了速度。但是容易出错,拷贝宏代码时会产生边际效应。不可以调试。无法操作私有数据成员。assert除外,用于宏定义,不是函数。
内联函数可以调试:在debug版本中没有真正内联,像普通函数一样,release版本中才会真正内联。
数据结构:
1.进制问题 一些概念理解不清
n位的2进制:
2^(n-1)*(an)+2^(n-2)*an-1+.....2^(0)*(a0)
问题:
假设在n进制下,下面的等式成立,n值是()240*12=2880 解答: (2*(n^2)+4*(n^1)+0*1)*(1*(n^1)+2*(n^0))=2*(n^3)+8*(n^2)+8*(n^1)+0 等式恒成立,所以结果是任意进制
2.线性表
循环链表是另一种形式的链式存储结构。将链表中最后一个指针域从null改变为开始节点。
队列是只允许在一端插入另一端删除的链式结构。
栈是在栈顶进行插入,删除的链式结构。
“关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。不是线性表。
3.struct类型的大小:
64位处理器中:指针为8个字节,int是4个字节,char是1个字节,总共13字节,但是struct必须是8的整数倍,所以16个字节。
4.iterator.erase()方法
是删除当前的字符,指针指向下一个字符。
#include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(*itor==300) { itor=array.erase(itor); } } for(itor=array.begin();itor!=array.end();itor++) { cout<<*itor<<""; } return 0; }
答案为:
100 300 300 500
5.
c错误原因:类的常量才是不可修改。
关于静态成员的特性可参考借鉴另一个博客:http://www.cnblogs.com/morewindows/archive/2011/08/26/2154198.html谢谢。
linux:
linux是一点都不了解的。
1.linux多路复用I/O接口select和epoll来实现高并发
区别:select轮询方式,效率低,epoll是触发式的,效率较高
1:select中socket的数量是有限制的,由FD_SETSIZE决定一般是1024.通过遍历FD_SETSIZE1024个socket来决定调度哪个socket,不管是否活跃都会全部遍历一次。
2.epoll无限制,是触发式的,当有socket事活跃态的时候则callback,若所有的都是活跃态则回到了遍历方式。
socket数量限制问题的解决:
1.修改FD_SETSIZE定义的宏,重新编译进内核,但是这会导致网络质量的下降。
2.实现多进程。
epoll不会IO效率不随FD数目增加而线性下降
Select会
epoll的适用情景就是大量的socket,但是活跃多不是很高的情况。epoll通过共享存储实现内核和用户的数据交互。