[英]GCC and devirtualization inlining
為什么在下面的代碼中,編譯器知道確切的類型卻不能內聯虛擬函數?
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中時,我以示例的方式看待:
我看不到有fire
或show
的電話。 它保留用於顯示的實現,但未使用。 正確,因為它具有外部鏈接。
如果將所有內容放在匿名名稱空間中,則可以省略實現。
您可以在問題中加上匯編代碼嗎? 供參考,這是從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.