天天看点

2022秋招cpp相关面试总结(长期更新)1、内存对齐2、类的占用空间死锁elf优化bin文件c语言和c++中const区别sizeof原理malloc一块内存free怎么找到头尾

1、内存对齐

类也具有4字节对齐功能。

计算机内存空间按照byte划分。处理器按照字节,双字节,四字节,八字结,16字节,32字节为单位存取内存。

好处

数据任意存放的话,int存放在地址1开始的四个字节,处理器需要先从0地址开始读取,剔除0,再从地址4开始读取下一个4字节块,继续剔除不需要的567,留下两块需要的放入寄存器,需要很多工作。

内存对齐可以让处理器在取数据时一次性读出来。

对齐规则

编译器对齐系数,有默认,可以改。

  • 结构体中第一个成员a0偏移量=0.以后每个成员ai相对于结构体首地址的offset=min(size(ai), 有效对齐值)*n。
  • 总大小=有效对齐值*n。

2、类的占用空间

空类

  • 为了能区分不同的对象,一个空类在内存中占一个字节。
  • 子类继承父类后,子类仍然是空类,子类也是一个字节。
  • 如果子类不是空类,按照成员变量所占字节大小计算。

成员函数

  • 函数在内存中不占字节。
  • 如果父类中有一个虚函数,32位编译器,占用四个字节。
  • 类中有几个虚函数占用字节都是4.子类也是。
  • 子类内存字节数为父类+自身。

静态成员

  • 不占内存。存储在静态区。
  • 初始化必须在类外。

死锁

原因

  1. 不可剥夺资源的竞争
  2. 进程推进顺序非法
  3. 信号量使用不当
  4. 四个必要条件:互斥+不可剥夺+请求保持+循环等待

避免

  1. 加锁顺序:需要事先知道所有可能用到的锁。
  2. 加锁时限:尝试超时就放弃请求并回退释放已经获得的锁。
  3. 死锁检测:获得锁会在线程和锁相关的数据结构(map,graph)中记下,每当有线程请求锁,也记录在这个数据结构中。请求失败后这个线程可以遍历锁关系图看是否死锁。如果有,就释放所有锁,回退,等待随机时间后重试。
  4. 给这些线程设置优先级,检测到死锁后让一个或几个线程回退。在死锁发生时设置随机优先级。

elf

elf详解

优化bin文件

c语言和c++中const区别

int a = 10;
const *p = &a;
*p = 20;
printf("a = %d\n", a);
           

c: a=20

c++: a=10

c

编译时遇到const不会给这个变量单独分配空间。

c++

遇到const变量,将原来的遍历存到一个符号表,给这个遍历单独分配一个内存空间,p指向这个空间。给*p赋值就是给这个空间赋值

  1. const常量为全局的时候,并且在其他文件中需要用到时会分配空间。
  2. 使用&取const常量地址时分配临时空间。

sizeof原理

malloc一块内存free怎么找到头尾

继续阅读