各類C++實現對C++類/對象的內存佈局可能有所不一樣,包括數據成員的順序、虛函數表(virtual table: vtbl)的結構、繼承關係的處理等。瞭解C++類/對象的佈局,對於理解C++各類機制,正確合理地進行設計和開發有很大的幫助。函數
本文所述的3款主流編譯器都提供打印/導出C++類/對象的內存佈局的功能,現用表格列出其特性和用法,測試用的代碼文件列於文後(data.cpp)佈局
編譯器及驗證版本 | 用法 | 說明 |
gcc 4.8.4 | gcc --fdump-class-hierarchy data.cpp | 導出的佈局圖示在data.cpp同一目錄下的一個.class文件中,測試 如data.cpp.002t.class,內容示例:spa VTT for A |
clang 3.4 | clang -Xclang -fdump-record-layouts data.cpp | 要求data.cpp中有對相關類作sizeof求值的語句,輸出在stdout,相似code *** Dumping AST Record Layout |
VC++ 2010 | 添加編譯選項blog /d1reportSingleClassLayout<類名> :輸出單個類相關佈局繼承 或seo /d1reportAllClassLayout: 輸出全部類相關佈局 |
編譯時輸出在「輸出」窗口中,相似以下: 1> class A size(8): |
data.cpp
#include <cstdio> class X {}; class Y : public virtual X {}; class Z : public virtual X {}; class A : public Y, public Z {}; int main(int argc, char** argv) { printf("Ptr: %lu\n", sizeof(void*)); printf("X: %lu\n", sizeof(X)); printf("Y: %lu\n", sizeof(Y)); printf("Z: %lu\n", sizeof(Z)); printf("A: %lu\n", sizeof(A));
return 0; }