基础知识V4--三面

tcp三次握手的过程,accept发生在三次握手哪个阶段?

三次握手之后。

TCP流, UDP的数据报,之间有什么区别,为什么TCP要叫做数据流?

流无边界,数据报有边界。TCP是先进先出的,并且可靠。

const的含义及实现机制,比如:const int i,是怎么做到i只可读的?

const用来说明所定义的变量是只读的。

这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用。

valitale的含义

valitale 的意思是“易变的”,它的作用是建议编译器,此处必须得从地址去取,不得作相关优化。

OFFSETOF(s, m)的宏定义,s是结构类型,m是s的成员,求m在s中的偏移量

感觉有点难

#define OFFSETOF(s, m) ({s s1;(void*)(&s1)-(void*)(&s1->m);}) 

100亿个数,求最大的1万个数,并说出算法的时间复杂度。

建一个堆,先把最开始的1万个数放进去。以后每进一个,都把最小的赶出来。

设计一个洗牌的算法,并说出算法的时间复杂度。

参考:一步一步写算法(之洗牌算法) - 平凡的程序员 - 博客频道 - CSDN.NET

计算机网络的五层协议

计算机网络中五层协议分别是
1) 物理层
2)数据链路层
3)网络层
4)传输层
5)应用层

C++的内存分配方式:

  • 就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用
  • 就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收
  • 自由存储区 就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的
  • 全局/静态存储区 就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的
  • 常量存储区 这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

32位系统一个进程最多多少堆内存

网上看到的分析:
32位意味着4G的寻址空间,linux把它分为两部分:最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身,成为“系统空间”,而较低的3G字节(从0x00000000到0xbffffff)用作各进程的“用户空间”。这样,理论上每个进程可以使用的用户空间都是3G。当然,实际的空间大小收到物理存储器大小的限制。虽然各个进程拥有其自己的3G用户空间,系统空间却由所有的进程共享。从具体进程的角度看,则每个进程都拥有4G的虚拟空间,较低的3G为自己的用户空间,最高的1G为所有进程以及内核共享的系统空间。

exit() _exit()的区别

exit()_exit()的基本区别在于前一个调用实施与调用库里用户状态结构
(user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序
(译者注:自定义清除程序由atexit函数定义,可定义多次,并以倒序执行),相对
应,后一个函数只为进程实施内核清除工作。

指针和引用的区别

指针和引用的联系与区别
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
4. 引用没有 const,指针有 const;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7. 指针和引用的自增(++)运算意义不一样;
8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

extern c 是干啥的

由于C++支持函数重载,语言C则不支持等原因
假设有函数原型为
void foo( int x);
被C编译器编译后在符号库中的名字为_foo,而被C++编译器则会产生像_foo_int类似的名字,即所谓的“由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。”
以下是常用用法

当一个函数已经由C编译器实现
用C++编译器实现C和C++都可调用的函数

参考资料

新鲜出炉的腾讯后台开发三面面试题!-C/C++-ChinaUnix.net
腾讯后台开发三面面试题
一步一步写算法(之洗牌算法) - 平凡的程序员 - 博客频道 - CSDN.NET
Linux后台开发应该具备技能
一个进程能用的最大内存(堆区)空间大小为1G
i++是否原子操作?并解释为什么??????? - zyq522376829的专栏
一篇很厉害的博客:
虚函数实现原理(转)
还有一篇也是讲虚函数的:
虚函数实现原理

你可能感兴趣的:(面试)