C 面試題 Windows記憶體管理的方法

2021-08-15 11:07:34 字數 1731 閱讀 3163

//

聯絡人:

石虎暱稱

:嗡嘛呢叭咪哄

一、虛擬記憶體的概念

當程式執行時需要從記憶體中讀出這段程式的**。**的位置必須在物理記憶體中才能被執行,由於現在的作業系統中有非常多的程式執行著,記憶體中不能夠完全放下,所以引出了虛擬記憶體的概念。把哪些不常用的程式片斷就放入虛擬記憶體,當需要用到它的時候在load入主存(物理記憶體)中。這個就是記憶體管理所要做的事。記憶體管理還有另外一件事需要做:計算程式片段在主存中的物理位置,以便cpu排程。

二、記憶體管理

1.記憶體管理有塊式管理,頁式管理,段式和段頁式管理。現在常用段頁式管理

塊式管理:把主存分為一大塊、一大塊的,當所需的程式片斷不在主存時就分配一塊主存空間,把程 序片斷load入主存,就算所需的程式片度只有幾個位元組也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的記憶體空間,但時易於管理。

頁式管理:把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。

段式管理:把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外乙個缺點。乙個程式片斷可能會被分為幾十段,這樣很多時間就會被浪費在計算每一段的實體地址上(計算機最耗時間的大家都知道是i/o吧)。

段頁式管理:結合了段式管理和頁式管理的優點。把主存分為若干頁,每一頁又分為若干段。好處就很明顯,不用我多說了吧。

各種記憶體管理都有它自己的方法來計算出程式片斷在主存中的實體地址,其實都很相似。

三、指標和引用的區別,引用可以用常指標實現?

1.本質上的區別是,指標是乙個新的變數,只是這個變數儲存的是另乙個變數的位址,我們通過訪問這個位址來修改變數。

而引用只是乙個別名,還是變數本身。對引用進行的任何操作就是對變數本身進行操作,因此以達到修改變數的目的。

(1)指標:指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。

而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(2)可以有const指標,但是沒有const引用;

(3)指標可以有多級,但是引用只能是一級(int **p;合法 而int &&a是不合法的)

(4)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)"sizeof引用"得到的是所指向的變數(物件)的大小,而"sizeof指標"得到的是指標本身的大小;

(7)指標和引用的自增(++)運算意義不一樣;

注意: 指標傳參的時候,還是值傳遞,試圖修改傳進來的指標的值是不可以的。只能修改位址所儲存變數的值。

引用傳參的時候,傳進來的就是變數本身,因此可以被修改。

謝謝!!!

C 記憶體管理相關面試題

1.malloc free和new delete的區別 malloc free和new delete的共同點是 都是從堆上申請空間,並且需要使用者手動釋放。不同的地方是 1.malloc和free是函式,new和delete是操作符2.malloc申請的空間不能初始化,而new可以初始化 3.mal...

c 記憶體管理常見面試題

1 malloc free和new delete的區別 malloc和free和new delete的共同點是 都是從堆上申請空間的,並且需要使用者手動釋放。不同點 1 malloc和free是函式,new和delete是操作符 2 malloc申請的 空間不會被初始化,new可以初始化 3 mal...

iOS 記憶體管理面試題(記憶體布局)

記憶體布局 2 64bit和32bit下 long 和char所佔位元組是不同的 char 1位元組 ascii 2 256個字元 char 即指標變數 4個位元組 32位的定址空間是2,即32個bit,也就是4個位元組。同理64位編譯器為8個位元組 short int 2個位元組 範圍 2 2 即...