自我介绍
- 部门是做什么的,百度搜索架构部,是百度搜索的主要部门,日常负责维护百度搜索以及搜索优化。
C++问题
- 声明和定义的区别?
声明是将一个名称引入程序。定义提供了一个实体在程序中的唯一描述,涉及到内存空间的分配以及初始值的设定。声明和定义有时是同时存在的。
常见的赋值语句为定义即声明。
几种只声明不定义的情况:
void display(); 提供函数声明
extern int a;
class A;
typedef 声明;
在类中定义的静态数据成员的声明
- 内存分配的几种方式?
栈区(Stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
堆区(Heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
全局区(静态区静态static):全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。
文字常量区 (Stack):常量字符串就是放在这里的。 程序结束后由系统释放。
程序代码区(Stack):存放函数体的二进制代码。
栈区和堆区的区别
堆和栈中的存储内容:栈存局部变量、函数参数等。
堆存储使用new、malloc申请的变量等。
申请方式:栈内存由系统分配,堆内存由自己申请。
申请后系统的响应:
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
申请大小的限制:Windows下栈的大小一般是2M,堆的容量较大。
申请效率的比较:栈由系统自动分配,速度较快。堆使用new、malloc等分配,较慢。
总结:栈区优势在处理效率,堆区优势在于灵活。
- memcpy和memset的区别?为什么memset不能初始化一些其他类。
对于memcpy:
功能:由src所指内存区域复制count个字符串到dest所指内存区域.
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.
对于memset:
功能:把buffer所指内存区域的前count个字节设置成字符c
说明:返回指向buffer的指针.
memset 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '
memcpy 是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度.
memset是一个字节一个字节设置的,取要赋的值的后8位二进制进行赋值。所以当memset赋值为1时会出现错误。
-
c++使用c代码使用什么关键字?
使用 extern "C" {}. -
const关键字以及其使用场景?
- const变量: 不能修改值,定义时初始化 const int pi = 3.1415;
- const类对象: 不能修改成员变量的值,不能调用非const函数。const myClass a;
- 指向const变量的指针:指向内容不可变,指向可变. const int* a;
- const 指针:指向内容可变,指向不可变。 int* const a;
- 指向 const 变量的 const 指针。指向不可变,指向内容也不可变。const int* const a;
- const 变量作为函数参数。函数内部不能修改该参数值。void myFun(const int a);
- const 返回值. 用以返回const引用,上层不能用返回的引用来修改对象。 const string& myFun()
- const 成员变量. 必须在初始化列表进行初始化,之后不能改变。
- const 成员函数。 此函数不应该修改任何成员变量,传给const成员函数的this指针,是指向const对象的const指针。
内存问题
- 内存分配的几种方式?
从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。
从栈区分配:在执行函数的时候,函数中的局部变量的存储单元都可以从栈中分配,函数执行结束后这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器的指令集中,效率很高 但是分配的内存容量有限。
从堆中分配:也称为动态内存分配,在程序运行期间,可以使用malloc和new申请任意数量的内存单元,由程序员决定在什么时候使用free和delete释放内存。
操作系统问题
-
进程和线程之间的区别?
进程是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独立运行的一段程序。
线程又是什么?线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。
联系:- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
- 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
- 处理机分给线程,即真正在处理机上运行的是线程。
- 线程是指进程内的一个执行单元,也是进程内的可调度实体。
-
进程间通信的方式?
- 管道/匿名管道(pipe):
- 有名管道(FIFO)
- 信号(Signal)
- 消息(Message)队列
- 共享内存(share memory)
- 信号量(semaphore)
- 套接字(socket)
-
线程对内存进行读写时会出现哪些问题?怎么解决这些问题?
- 临界区(Critical Section)
- 互斥量(Mutex)
- 信号量(Semaphores)
- 事件(Event)
- 队列
-
cpu调度机制?
- 先到先服务调度算法(FCFS)
- 最短作业优先调度(SJF)
- 优先级调度
- 轮转法调度(RR)
- 多级队列调度
- 多级反馈队列调度
编程题
- 快排
- 合并两个有序链表