某日二師兄參加XXX科技公司的C++工程師開發崗位第8面: > 面試官:C++中,函數的參數應該傳值還是傳引用? > > 二師兄:要看參數的用途。如果是出參,必須傳引用。如果是入參,主要考慮參數類型的大小,來決定傳值還是傳引用。 > > 面試官:為什麼不使用指針? > > 二師兄:傳指針也稱之為傳引 ...
某日二師兄參加XXX科技公司的C++工程師開發崗位第8面:
面試官:C++中,函數的參數應該傳值還是傳引用?
二師兄:要看參數的用途。如果是出參,必須傳引用。如果是入參,主要考慮參數類型的大小,來決定傳值還是傳引用。
面試官:為什麼不使用指針?
二師兄:傳指針也稱之為傳引用(
pass by refereence
)。但是在C++中不推薦使用指針,因為指針需要判斷是否位空,而引用則無需擔心。面試官:入參傳值還是傳引用有什麼標準嗎?
二師兄:沒有標準吧。一般參數類型大小大於16位元組(64位操作系統)時,傳引用效果要好於傳值。
面試官:為什麼?
二師兄:因為傳值相當於拷貝構造,當變數的類型尺寸大於16位元組時,拷貝構造所消耗的時間大於解引用。此時傳引用收益更高。
面試官:你知道函數參數傳遞的過程中,寄存器起什麼作用嗎?
二師兄:額。。瞭解過一些。一般簡單的數據類型,可以通過寄存器傳遞。而對於結構圖和類則使用是通過堆棧傳遞參數。當然不同的編譯器對此實現不盡相同。
面試官:那麼你知道什麼是
cdel
、stdcall
、fastcall
、thiscall
嗎?二師兄:聽說過,不是很瞭解。。
面試官:好的,回去等通知吧。
今日二師兄的表現比較穩定,只有最後一問沒有回答上來:
你知道什麼是
cdel
、stdcall
、fastcall
、thiscall
嗎?
這些都是C++中的函數調用約定。它們決定了函數參數的傳遞方式和堆棧的清理方式。
cdecl
是預設的調用約定,它將參數按照從右到左的順序依次壓入堆棧中,由調用者負責清理堆棧。stdcall
將參數按照從右到左的順序依次壓入堆棧中,由被調用函數負責清理堆棧。fastcall
將前兩個整型或指針參數存儲在寄存器中,其餘參數按照cdecl
約定壓入堆棧中。thiscall
是用於成員函數的調用約定,它將this
指針作為隱式參數傳遞,並將其存儲在寄存器或堆棧中,其餘參數按照cdecl
約定壓入堆棧中。
需要註意的是,這些約定可能因編譯器和平臺的不同而不同。
好了,今日份面試到這裡就結束了,小伙伴們,對於今天二師兄的面試,能打幾分呢?
關註我,帶你21天“精通”C++!(狗頭)