首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 編譯器對類成員變量與函數的處理機制

     編輯:關於C++

核心結論

成員變量與成員函數分開存儲:

  • 普通成員變量 → 對象內存中(同 struct 佈局)。
  • 靜態成員變量 → 全局數據區。
  • 成員函數(含虛函數表指針) → 代碼段。

this 指鈕機制

普通成員函數隱式第一參數為 this 指針。調用 obj.func() 實際為 func(&obj)。靜態成員函數無 this,僅按作用域解析。

驗證代碼

class C1 { int i,j,k; };           // sizeof=12
class C2 { int i,j,k; static int m;
    int getK() const { return k; }
    void setK(int v) { k=v; }
};                                   // sizeof=12 (靜態不計入)
struct S1 { int i,j,k; };           // sizeof=12
struct S2 { int i,j,k; static int m; }; // sizeof=12

輸出均為 12,證明函數不佔對象空間,靜態成員不佔對象空間。

內存佈局圖解

對象 obj:  [i][j][k]  ← 數據成員
代碼段:    C2::getK()  ← 隱含 this 指針參數
            C2::setK()
靜態區:    C2::m

關鍵點總結

  1. C++ 對象模型 = C 結構體 + 隱式 this 指針傳遞。
  2. 普通成員函數編譯為全局函數,第一參數 Class* const this。
  3. 靜態成員函數編譯為普通全局函數,無 this。
  4. 虛函數通過 vptr/vtable 實現動態綁定,vptr 佔對象首部大小(通常 4/8 字節)。

總結

理解編譯器如何將類映射為內存佈局與函數調用,是掌握 C++ 對象模型、多態實現、內存優化的基礎。核心口訣:「數據在對象,代碼在代碼段,this 傳遞連接兩者」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved