天天看點

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怎麼找到頭尾

繼續閱讀