秋招日记(一)中望一面面试问题解答
学习记录
-
《深入理解计算机系统》
第5章 优化程序性能
第7章 链接
我的面试问题解决
-
栈溢出是什么?栈溢出的原因是什么?
- 栈溢出(Stack Overflow)是程序设计领域的问答(炫技)网站(不是,手动狗头,哈哈)。
- 栈是内存中用于保存程序运行中的局部数据的区域,当指程序使用的栈内存超出最大值,就会发生栈溢出错误,程序就会出现错误。
- 栈溢出是指在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段
- 为了实现栈溢出要满足两个条件:
- 第一、程序要有向栈写入数据的行为
- 第二、程序并不限制写入数据的长度
- C++中使用栈的情形(这些情形均会导致栈溢出):
- 函数调用时传递实参
- 函数内部定义局部自动变量
- 函数返回一个对象时
- 需要大量用栈,可能导致栈溢出的情景
- 递归调用(递归层数过多)
- 函数内部定义局部自动变量数组变量(写入数据大于buffer)
-
weak_ptr的使用情景
- 定义:weak_ptr是一种与shared_ptr配合使用的智能指针,其可以访问资源但是却不享有资源的所有权,不影响资源的引用计数。有可能资源已被释放,但weak_ptr任然存在,因此每次访问时都要判断资源是否有效。weak_ptr不是一个独立的智能指针,而是shared_ptr的一种扩充,weak_ptr一般是通过shared_ptr来创建的。
- 应用场景——循环引用:
- shared_ptr通过引用计数的方式管理内存,当引用计数为0时,自动释放内存。
- 但是当两个对象分别持有对方的指向对方的shared_ptr时,这种shared_ptr环路阻止了A和B的析构,即使程序的其他部分已经不再使用这两个对象,这两者也会保持着彼此的引用计数为一。
- 此时程序的其他部分已经无法访问这两个对象了,但是这两个对象的资源也得不到回收,产生了内存泄漏。
- 使用weak_ptr指针取代环路中的一个shared_ptr,由于weak_ptr不影响引用计数,所以被weak_ptr指向的对象可以正常析构,而此时另一个对像中的weak_ptr指针会变成空悬指针,通过对于该指针是否空悬的判断,此对象就能获知另一个对象的信息。
-
内存对齐的定义及目的
- 什么是内存对齐?
- 实际的计算机系统对于基本的类型数据再内存中存放的位置有限制,所以它们会要求这些数据的首地址的值是某个数K(通常为4或8)的倍数
- 这使得在创建一个只含有一个int 和char的结构体的大小从 5(4+1) 变成了 8(4+4)
- 为什么要进行内存对齐
- 尽管内存是以字节为单位的,但是大部分处理器并不是按照字节块来存取内存的,一般都会根据处理器的位数按照4字节、8字节为单位来存去内存。
- 考虑不进行内存对齐,在地址1上保存一个4字节的int数据,当处理器以4字节读取时,为了读取这个int就必须先读取0~3,然后剔除0,之后读取4~7,然后剔除5,6,7浪费了大量的时间。
- 内存对齐规则
- 在gcc中默认对齐系数为4,可以通过#pragma pack(n), n = 1,2,4,8,16来改变该系数
- 有效对齐值:给定的对齐系数和结构体中最长数据类型中较小的那个作为对齐单位
- 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的offset,都是该成员大小与有效对齐值中较小的那个的整数倍
- 结构体的总大小为有效对齐值的整数倍
- 基本类型的对齐值就是其sizeof值
- 结构体的对齐值是其成员的最大对齐值
- 编译器可以设置一个最大的对齐值,类型的实际对齐值是该类型的对齐值与默认对齐值取最小值得来
- 什么是内存对齐?
-
线程与进程的通信方式有哪些?
- 线程的通信方式(线程同步机制)
- 信号量
- 信号
- 互斥量
- 互斥锁
- 进程的通信方式
- 管道
- 消息队列
- 共享内存
- 信号量
- 信号
- 套接字 socket
- 线程的通信方式(线程同步机制)
-
对于项目的总体描述和遇到的困难
略 :)
面试问题收集
-
强弱符号的概念
-
链接顺序相关知识
-
函数的调用约定的相关知识
- 虚继承的定义及解决的问题
参考:
#我的秋招日记##C/C++##C++工程师#