劍指offer三 關於sizeof

2021-09-13 20:19:18 字數 1776 閱讀 1682

通常語言面試有3種型別,第一種型別是面試官直接詢問應聘者對c++概念我的理解。這種型別的問題,面試官特別喜歡了解應聘者對c++關鍵字的理解程度。例如:在c++中,有哪4個與型別轉換相關的關鍵字?這些關鍵字各有什麼特點,應該在什麼場合下使用?

在這種型別的題目中,sizeof是經常被問道的乙個概念。比如下面的面試片段,就反覆出現在各公司的技術面試中。

面試官:定義乙個空的型別,裡面沒有任何成員變數和成員函式。對該型別求sizeof,得到的結果是多少?

應聘者:答案是1。

面試官:為什麼不是0?

應聘者:空型別的例項中不包含任何資訊,本來求sizeof應該是0,但是當我們宣告該型別的例項的時候,它必須在記憶體中占有一定記憶體,否則無法使用這些例項。至於佔多少記憶體,由編譯器決定。在vs中每個空型別的例項占用1個位元組的空間。

面試官:如果在該型別中新增乙個建構函式和析構函式,再對該型別求sizeof,得到的結果又是多少?

應聘者:和前面一樣,還是1。呼叫建構函式和析構函式只需要知道函式的位址即可,而這些函式的位址只與型別相關,而與型別的例項無關,編譯器也不會因為這兩個函式而在例項內新增任何額外的資訊。

面試官:那如果把析構函式標記為虛函式呢?

應聘者:c++編譯器一旦發現乙個型別中有虛函式,就會為該型別生成虛函式表,並在該型別的每乙個例項中新增乙個指向虛函式的指標。在32位的機器上,乙個指標佔4個位元組,因此求sizeof得到4;如果是64位的機器,乙個指標佔8個位元組,因此求sizeof則得到8。

定義乙個空的型別 :

新增乙個建構函式和析構函式:

將析構函式標記為虛函式:

面試c++第二中題型就是面試官拿出事先準備的**,讓應聘者分析**的執行結果。這種題型選擇的**通常包含比較複雜微妙的語言特性,這要求應聘者對c++考點有著透徹的理解。即使應聘者對考點有一點點模糊,那麼最終他得到的結果和實際執行的結果可能會差距甚遠。

參考:劍指offer 

劍指offer 第三波

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 解題思路 有兩點需要注意的,一是可以再新增乙個函式,該函式用於判斷兩子樹以當前點作為根節點是否相互包含。另外需要注意的是,遞迴的部分可以做一點優化,如果左子樹已經包含了proot2,則可以不用再判斷右子樹而直接得...

劍指Offer(三) 遞迴問題

猴子吃桃問題 猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了乙個第二天早上又將剩下的桃子吃掉一半,又多吃了乙個。以後每天早上都吃了前一天剩下的一半零乙個。到第10天早上想再吃時,見只剩下乙個桃子了。求第一天共摘了多少。此問題與漢諾塔的問題類似,主要是 來實現遞迴求解。最後一天剩1個,那就是...

劍指offer 關於複製建構函式

1 首先參看 include stdafx.h include iostream using namespace std class a a a other 這是錯誤的 複製構造函式引數為類物件本身的引用,用於根據乙個已存在的物件複製出乙個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製...