建構函式符號的雙重發射
理解問題
在GCC 編譯的程式碼中,沒有虛擬基類的類別的建構子可能會在庫中出現重複列表,引發有關此行為背後原因的疑問。詳細來說,Itanium C ABI 為 C 符號定義了一組命名約定,包括建構子。
ABI 解析
讓我們檢查一下這些建構子的損壞名稱:
- _Z3fooEv:Thing::foo() 的建構子
- _ZN5ThingC1Ei:Thing(int)的完整物件建構子
- _ZN5ThingC2Ei:Thing(int) 的基礎物件建構子
- _ZN5ThingC1Ev:Thing() 的完整物件建構子
- 255:ThingC)的基礎物件建構子
如您所見,建構函式透過 C1(完整物件建構子)進行區分和 C2(基礎物件建構子)後綴。
不同的建構子
這種二元性源自於多態性支持,儘管在本例中並不是嚴格要求的。完整的物件建構子也會初始化虛擬基類,而基底物件建構函式初始化資料成員和非虛擬基底類別。
多重定義
儘管庫列表中有多個條目,但這些重複的構造函數確實不會導致「符號 __ 的多重定義」錯誤。這是因為 ABI 為每個建構函式類型提供了唯一的重整名稱,確保連結器將它們視為不同的符號。
結論
GCC 編譯程式碼中構造函數符號的雙重發射是多態性支持和 Itanium C ABI 命名約定的結果。理解這些概念可以闡明此行為背後的原因,並解決有關多個定義的任何問題。
以上是為什麼沒有虛擬基底類別的類別的建構函式在 GCC 編譯的程式碼中出現重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!