在使用 gdb 進行除錯時,列印 vtable 會產生如下內容:
(gdb) info vtbl *object
vtable for 'my_namespace_B::MyDerivedObject' @ 0x555555690bf0 (subobject @ 0x5555556ab710):
[0]: 0x55555559ff42 <my_namespace_A::MyBaseObject::function1[abi:cxx11]() const>
[1]: 0x5555555a016c <my_namespace_A::MyBaseObject::function2[abi:cxx11]() const>
[2]: 0x5555555a030a <my_namespace_A::MyBaseObject::function3() const>
[5]: 0x5555555a47f8 <my_namespace_B::MyDerivedObject::~MyDerivedObject()>
[6]: 0x5555555a4846 <my_namespace_B::MyDerivedObject::~MyDerivedObject()>
[7]: 0x5555555a0a80 <my_namespace_B::MyDerivedObject::fun1(bool)>
部分是什么[abi:cxx11]意思?我理解這應該意味著那部分代碼是使用 cxx11 特性編譯的。
- 這種理解是否正確?
- 這可能會產生什么影響?
- 這可能是
fun1從內部呼叫虛函式BaseObject::nonVirtualMemberFunction產生未定義行為的原因嗎?
uj5u.com熱心網友回復:
這是abi_tag屬性,可以直接應用于您的函式,也可以標記回傳型別。
很可能您的函式只是 return std::string,其中 libstdc 標記使用abi_tag("cxx11")舊的 C 03 寫入時復制字串編譯的代碼不會鏈接到現代代碼并靜默中斷。
沒有“可見”的差異,只是如果你用舊字串 ABI 編譯了一些東西,它就不會鏈接。它應該與任何其他虛擬功能一樣作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516307.html
上一篇:使用逗號格式的多個值獲取用戶輸入
