簡體   English   中英

GCC和非虛擬化內聯

[英]GCC and devirtualization inlining

為什么在下面的代碼中,編譯器知道確切的類型卻不能內聯虛擬函數?

https://goo.gl/AgvefX

using namespace std;

struct Base{
    void fire(){
        show();
    }

    virtual void show() =0;/*{
        cout << "base";
    }*/
};

struct A : Base{
    inline __attribute__((__always_inline__)) void show() {
        cout << "a";
    }
};

int main() {
    A a;
  for (int i=0;i<1000;i++){
    a.fire();
  }
    //a.fire();

    return 0;
}

沒有CRTP,我可以對此做些什么嗎?

我不擅長閱讀匯編器代碼,但是在main中時,我以示例的方式看待:

  1. 1000裝入寄存器
  2. 減去1,
  3. 地址“ a”已加載,並且
  4. 輸出運算符在
  5. 跳回到循環的開始。

我看不到有fireshow的電話。 它保留用於顯示的實現,但未使用。 正確,因為它具有外部鏈接。

如果將所有內容放在匿名名稱空間中,則可以省略實現。

您可以在問題中加上匯編代碼嗎? 供參考,這是從providers鏈接生成的匯編代碼:

.LC0:
    .string "a"
A::show():
    movl    $1, %edx
    movl    $.LC0, %esi
    movl    std::cout, %edi
    jmp std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
main:
    pushq   %rbx
    movl    $1000, %ebx
.L3:
    movl    $1, %edx
    movl    $.LC0, %esi
    movl    std::cout, %edi
    call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
    subl    $1, %ebx
    jne .L3
    xorl    %eax, %eax
    popq    %rbx
    ret
    subq    $8, %rsp
    movl    std::__ioinit, %edi
    call    std::ios_base::Init::Init()
    movl    $__dso_handle, %edx
    movl    std::__ioinit, %esi
    movl    std::ios_base::Init::~Init(), %edi
    addq    $8, %rsp
    jmp __cxa_atexit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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