在查看了有關此主題的幾個問題(和答案)后,我在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
如果有人能解釋這兩個不同的組裝指令在做什么,我將不勝感激?
uj5u.com熱心網友回復:
每個成員函式都this作為一個隱式的第一個引數。在該特定編譯器 ( Itanium ABI )使用的ABI 中,第一個引數在rdi暫存器中傳遞,并在rax( eax) 暫存器中回傳一個值(如果它是微不足道的,這里是)。
在第一種情況下,當您a通過參考回傳時,實際上回傳的是a. a是第一個成員,所以它的地址與物件的地址相同,即this。因此,您只需設定rax為rdi.
在第二種情況下,當您a按值回傳時,您需要進行實際的解參考。這就是DWORD PTR [rdi]正在做的事情。DWORD PTR意味著您要獲取 4 個位元組 ( sizeof(int))。
如果您在 之前放置一些資料成員a,您將看到添加到 的額外偏移量rdi。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392648.html
下一篇:Z80除法演算法運行不正常
