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

C++ 對象內存佈局:非靜態成員、虛函數指針、靜態成員、成員函數

     編輯:C++ 入門

問題

一個類包含:虛函數 print()、非靜態 int a、靜態 double b。其對象佔用多少內存?具體包含什麼?

答案:8 字節(32 位系統)

對象內存佈局包含:

  • 非靜態數據成員:int a(4 字節)。
  • 虛函數表指針 (vptr):指向虛函數表(4 字節)。

不包含:

  • 靜態成員變量 b:屬於類,所有對象共享一份,存儲在全局/靜態存儲區。
  • 成員函數(包括虛函數):存儲在代碼段,不屬於對象。

驗證代碼

#include <iostream>
class A {
public:
    virtual void print() {}
private:
    int a;
    static double b;
};
double A::b = 0.0;

int main() {
    std::cout << sizeof(A) << std::endl; // 輸出 8(32位)或 16(64位,vptr 8 字節)
    return 0;
}

補充:64 位系統

  • 指針 8 字節,對象大小通常為 16 字節(int 4 字節 + 填充 4 字節 + vptr 8 字節)。
  • 空類大小為 1(C++ 保證不同對象地址不同),有虛函數則為指針大小。

總結表

成員類型是否在對象中存儲位置
非靜態數據成員是對象內存
虛函數表指針 (vptr)是(若有虛函數)對象內存
靜態數據成員否全局/靜態區
非靜態成員函數否代碼段
虛函數否(僅 vptr 在對象)代碼段 + 虛表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved