回覆列表
  • 1 # 阿里叔叔丿

    對於這點,其實來自於C/C++的一貫堅持的哲學:不做產生額外開銷的事。

    具體到這個問題,是這樣的:

    對於POD型別(就是你所說的“內建型別”全稱是:Plain Old Data),因為他的資料結構和操作模型都已經在C的標準文中仔細定義了,而C++為了最大程度的相容C程式碼,這部分自然也要照抄。

    所以,C++完全沒有必要額外的增加“初始化為0”的開銷。一方面是為了相容C,另一方面是沒有付出這些額外開銷的必要性。

    對於非POD型別,初始化的額外開銷是不可避免的:因為(為了效能)它的記憶體佈局並沒有在標準中定義,甚至連vtable之類,也是實現相關的內容。所以,對於非POD型別如何佈局、如何初始化、各種狀態表明其“可用”……標準是把他交給編譯器和程式碼編寫者的。

    而既然把決策權和實現權交了出去,那為了程式碼跨平臺/跨編譯器的移植性和相容性考慮,自然就需要約定操作模型——這就是為什麼非POD型別要有一系列的特殊成員函式:包括建構函式、解構函式,另外還有複製構造和運算子。

    另外,在C++中,對於POD或者非POD型別,其實並沒有區別對待:當不提供明確初始化程式碼時,都沒有預設的“初始化為0”的操作。(static除外)

  • 中秋節和大豐收的關聯?
  • 戒菸時會便秘嗎?戒菸時該注意什麼?