簡體   English   中英

是否為 C++ 中的默認構造函數創建了匯編代碼

[英]Is assembly code created for Default Constructor in C++

如果我沒有在 C++ 中的 class 或任何其他構造函數中定義默認構造函數,我已經讀到編譯器會為您創建默認構造函數。 但是我創建了一個測試 class,將其編譯為匯編代碼並檢查發現沒有創建任何類型的東西。
有人可以澄清默認構造函數的代碼是如何創建的,還是首先創建的?

如果需要,將創建默認構造函數,例如:

class Foo {
  std::string s;
};

...
Foo f;

12.1:

默認構造函數 (12.1)、復制構造函數和復制賦值運算符 (12.8) 和析構函數 (12.4) 是特殊的成員函數。 當程序未顯式聲明這些成員函數時,實現將為 class 類型隱式聲明這些成員函數,除非在 12.1 中注明。 如果使用它們,實現將隱式定義它們,如 12.1、12.4 和 12.8 中所指定。

此外,如果您的 class 不需要在構造函數中執行任何操作,編譯器可能會選擇不生成代碼,即使按照標准構造函數應該存在。

這是 C++03 標准所說的:

§12.1/5:

class X 的默認構造函數是 class X 的構造函數,可以不帶參數調用。 如果 class X 沒有用戶聲明的構造函數,則隱式聲明默認構造函數。 隱式聲明的默認構造函數是其 class 的內聯公共成員。 如果構造函數是隱式聲明的默認構造函數並且滿足以下條件,則構造函數是微不足道的:

  • 它的 class 沒有虛函數 (10.3) 和虛基類 (10.1),並且
  • 其 class 的所有直接基類都有普通的構造函數,並且
  • 對於其 class 類型(或其數組)的 class 類型(或其數組)的所有非靜態數據成員,每個這樣的 class 都有一個簡單的構造函數。

§12.1/6:

否則,構造函數是不平凡的。

§12.1/7:

class 的隱式聲明的默認構造函數在用於創建其 class 類型 (1.8) 的 object 時被隱式定義。 隱式定義的默認構造函數執行 class 的一組初始化,這些初始化將由用戶編寫的 class 的默認構造函數執行如果該用戶編寫的默認構造函數格式錯誤,則程序格式錯誤。 在隱式定義 class 的隱式聲明的默認構造函數之前,應隱式定義其基類及其非靜態數據成員的所有隱式聲明的默認構造函數。 [注意:隱式聲明的默認構造函數具有異常規范 (15.4)。]


這意味着對於具有隱式聲明但未隱式定義的默認構造函數的類,或者對於具有隱式定義的普通默認構造函數的類,可能不需要代碼生成。

C++.= 組裝。

匯編是(一種可能的)output 用於已編譯的 C++ 程序,該程序可能包含也可能不包含某些優化,這些優化可能會省略對可能為空的構造函數的調用。

換句話說,該語言說有一個默認構造函數,但它只描述行為,而不是實現。 如果一個實現感覺它不需要生成代碼,它就沒有必要。

您是否想問一下您的編譯器是否真的為默認構造函數發出代碼?

這取決於優化。 大多數現代編譯器在與 -O0 一起使用時會發出默認的構造函數代碼序列,但如果它未使用並且您使用 -O2 或更高版本,則會對其進行優化。

暫無
暫無

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

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