類和物件(上篇)之面試題(結構體內存對齊)

2021-09-11 18:09:12 字數 2258 閱讀 2854

問題:c++中struct和class的區別是什麼?

解答:c++需要相容c語言,所以c++中struct可以當成結構體去使用。另外c++中struct還可以用來定義類。 和class是定義類是一樣的,區別是struct的成員預設訪問方式是public,class是struct的成員預設訪問方式是private。

【面試題】物件導向的三大特性:封裝、繼承、多型。

問題:我們通過對下面的不同物件分別獲取大小來進行分析

#includeusing namespace std;

//類中既有成員變數,又有成員函式

class a1

private:

int _a;

};//類中僅有成員函式

class a2

};//類中什麼都沒有——空類

class a3

;

sizeof(a1):?

sizeof(a2):?

sizeof(a3):?

結論:乙個類的大小,實際上就是該類中「成員變數」之和,當然也要進行記憶體對齊,注意空類的大小,空模擬較特殊,編譯器給了空類乙個位元組來標識這個類。

1.第乙個成員在與結構體偏移量為0的位址處。

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

注意:對齊數=編譯器預設的乙個對齊數與該成員的較小值。

vs預設對齊數為8,gcc預設對齊數為4.

3.結構體總大小為:最大對齊數的整數倍。

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是 所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

面試題

結構體怎麼對齊? 為什麼要進行記憶體對齊

如何讓結構體按照指定的對齊引數進行對齊

如何知道結構體中某個成員相對於結構體起始位置的偏移量

什麼是大小端?如何測試某台機器是大端還是小端,有沒有遇到過要考慮大小端的場景

舉例說明:

//例子1

struct s1

;printf("%d\n", sizeof(struct s1));//12

//例子2

struct s2

;printf("%d\n", sizeof(struct s2));//8

案例一分析

char型別佔乙個位元組,編譯器預設對齊數是8,所以該變數的對齊數為1,實際偏移量為0;

int型別佔了4個位元組,所以該變數的對齊數為8,實際偏移量是4

short型別佔了2個位元組,所以該變數的對齊數為2,實際偏移量為8

}1.this指標的型別:型別*const

2.只能在「成員函式」的內部使用

3.this指標本質其實是乙個成員函式的形參,是物件呼叫成員函式時,將物件位址作為實參傳遞給this形參。所以物件中不儲存this指標。

4. this指標是成員函式第乙個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞

面試題

1.this指標存在**?

解答:其實編譯器在生成程式時加入了獲取物件首位址的相關**。並把獲取的首位址存放在了暫存器ecx中(vc++編譯器是放在ecx中,其它編譯器有可能不同)。也就是成員函式的其它引數正常都是存放在棧中。而this指標引數則是存放在暫存器中。類的靜態成員函式因為沒有this指標這個引數,所以類的靜態成員函式也就無法呼叫類的非靜態成員變數。

2.this指標可以為空嗎?

可以為空,當我們在呼叫函式的時候,如果函式內部並不需要使用到this,也就是不需要通過this指向當前物件並對其進行操作時才可以為空(當我們在其中什麼都不放或者在裡面隨便列印乙個字串),如果呼叫的函式需要指向當前物件,並進行操作,則會發生錯誤(空指標引用)就跟c中一樣不能進行空指標的引用

C 面試題 之物件導向

說到物件導向,大家第一反應應該就是它的三大特性 封裝性 繼承性和多型性。那麼我們先簡單的了解一下這三大特性 1 封裝性 封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。在c 中類中成員的屬性有 public,protected,pr...

關於面試題中結構體內存對齊計算總結

原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照 pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。原則2 結構 或聯合 的整體對齊規則 在資料成員完成各自對齊之後,結構 或聯...

python面試題之物件導向and內建函式

1 物件導向 2 內建函式 hash 3 內建函式 eq 1 定義乙個類,然後類中物件的屬性有 姓名,性別,年齡,部門 2 假設幾年後,內部員工轉崗了,3 到了另乙個崗位後,姓名,性別,年齡新的部門,在另乙個員工表有了新的資料 4 然後我認定,假設員工物件的姓名和性別一致,那麼我就認定這是乙個人 5...