inline函数:
- 一个较为合理的经验准则是, 不要内联超过 10 行的函数,较大则不会成为内联函数,谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用。
- 有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要, 比如虚函数和递归函数就不会被正常内联.
- 内联函数的定义最好放在头文件中, 编译器才能在调用点内联展开定义,当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义定义在类声明之中的成员函数将自动地成为内联函数。
排序算法及其复杂度比较:
https://www.cnblogs.com/minkaihui/p/4077888.html
需要注意的是,像冒泡排序,在原数组本身有序的情况下,不需要交换,所以时间复杂度是O(n),具体实现如下:
void bubblesort()
{
if (len <= 1) return;
int i, j;
for (i = 0; i < len - 1; i++)
{
bool isswap = false;
for (j = 0; j < len - i - 1; j++)
{
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
isswap = true;
}
}
if (!isswap) return;
}
}
TCP/IP建立连接:
链接:https://www.nowcoder.com/questionTerminal/645abac8091548898054accd89083ec7
TCP建立连接时,首先客户端和服务器处于close状态。然后客户端发送SYN同步位,此时客户端处于SYN-SEND状态,服务器处于lISTEN状态,当服务器收到SYN以后,向客户端发送同步位SYN和确认码ACK,然后服务器变为SYN-RCVD,客户端收到服务器发来的SYN和ACK后,客户端的状态变成ESTABLISHED(已建立连接),客户端再向服务器发送ACK确认码,服务器接收到以后也变成ESTABLISHED。然后服务器客户端开始数据传输
关于系统调用:
系统调用通过中断完成,这一过程中系统由用户态变为内核态。 在内核态下,系统可以无限制的访问内核资源。
select和epoll效率差异:
链接:https://www.nowcoder.com/questionTerminal/c162e1e930a34ea3ad6c8863ccff0fa2?pos=50&orderByHotValue=0
来源:牛客网
select 和 epoll效率差异的原因:select采用轮询方式处理连接,epoll是触发式处理连接。
Select:
1.Socket数量限制:该限制可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
2.操作限制:通过遍历FD_SETSIZE(1024)个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。
Epoll
1.Socket数量无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限制(默认4k)。
2.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询。
但当所有的Socket都活跃的时候,所有的callback都被唤醒,会导致资源的竞争。既然都是要处理所有的Socket,
那么遍历是最简单最有效的实现方式。