簡體   English   中英

返回值與引用(在匯編中)

[英]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';
}

現在我看到為兩個成員函數getAByRefgetAByVal生成了不同的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM