首頁 >後端開發 >C++ >為什麼沒有虛擬基底類別的類別的建構函式在 GCC 編譯的程式碼中出現重複?

為什麼沒有虛擬基底類別的類別的建構函式在 GCC 編譯的程式碼中出現重複?

Susan Sarandon
Susan Sarandon原創
2024-11-16 16:01:03231瀏覽

Why do constructors for classes without virtual base classes appear duplicated in GCC-compiled code?

建構函式符號的雙重發射

理解問題

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn