[英]return value Vs reference (in assembly)
在看了一些關於這個主題的問題(和答案)之后,我在godbolt中嘗試了下面的簡單代碼。
#include <iostream>
class TwoInts
{
public:
TwoInts( ) = default;
const int& getAByRef( ) const;
int getAByVal( ) const;
private:
int a;
int b;
};
const int& TwoInts::getAByRef( ) const
{
return a;
}
int TwoInts::getAByVal( ) const
{
return a;
}
int main( )
{
TwoInts ti;
const int& num1 { ti.getAByRef( ) };
const int num2 { ti.getAByVal( ) };
//std::cout << num1 << ' ' << num2 << '\n';
}
現在我看到為兩個成員函數getAByRef
和getAByVal
生成了不同的代碼:
TwoInts::getAByRef() const:
mov rax, rdi
ret
TwoInts::getAByVal() const:
mov eax, DWORD PTR [rdi]
ret
如果有人能解釋這兩個不同的組裝說明在做什么,我將不勝感激?
每個成員 function 都會this
指針作為隱式參數。 在該特定編譯器使用的 ABI 中( Itanium ABI ,不要與 Itanium 架構混淆), this
作為rdi
寄存器中的第一個參數傳遞,並在rax
( eax
) 注冊。
在第一種情況下,當您通過引用返回a
時,實際上是在返回a
的地址。 a
是第一個成員,所以它的地址和object的地址一樣,即this
。 因此,您只需將rax
設置為rdi
。
在第二種情況下,當您a
值返回時,您需要進行實際的取消引用。 這就是DWORD PTR [rdi]
正在做的事情。 DWORD PTR
表示您要獲取 4 個字節( sizeof(int)
)。
如果您在a
之前放置一些數據成員,您會看到添加到rdi
的額外偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.