2012-10-14 38 views
3

在C++中,我假定C++標準與內存佈局方面的數據成員如何排列在一個類中沒有任何關係?我認爲這是否涉及編譯器是否正確?我很感興趣的是學習對象和其他C++實體(結構等)在物理內存中的表示方式(我知道列表是節點到節點,而數組是連續內存 - 但是語言的所有其他方面)。什麼是對象/結構等的C++內存佈局?

編輯:請問學習x86彙編幫助,這和理解C++好?

+0

可能最短的回答你的問題是結構字段或類中表示爲連續內存。 – taufique

回答

2

是,標準不說的對象是如何在內存中表示。爲了得到一個想法都表示normall C++對象如何讀這本書:inside C++ object model.

+1

該標準確定了一些有關如何在內存中表示對象的內容。但你說對了,還有很多它沒有指定 – jalf

6

C++標準確實規定了一些東西,但遠遠沒有一切。

主要規則是這些:在一個陣列

  • 對象被連續地佈置,它們之間沒有填充。
  • 類成員對象不由接入說明符(public:/private:/protected:)分離在存儲器中,其中他們聲明的順序被佈局,但有可能是成員對象之間的填充未指定的量。
  • 某些類型(標準佈局結構,在standardese術語),所述第一基類,或如果不存在,所述第一構件時,在同一個地址進行佈置時類本身。

該標準指定了一些零件,但總的來說,其餘的細節真的取決於編譯器。

+0

我有一個小問題,如果我有一個類,說10個成員函數。是否知道訪問第10個聲明的函數會比第1個函數慢?這是否在頭文件中聲明的順序? – user997112

+0

C++標準並沒有真正說出這些,但在任何理智的編譯器中,它沒有任何區別。成員函數根本不在對象中表示。在編譯時,編譯器確定要調用哪個函數,因此在運行時根本不需要查看對象內部。 – jalf

+1

@NicolBolas:來源? 9.2:12至少指定了第2點,並且適用於任何「非工會類」。也許你應該在糾正和降低他人之前檢查標準?如果您不確定,實際上允許您在發表評論之前發表評論以要求驗證。對於3點,你可能是正確的,我會解決我的答案,以反映 – jalf