首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 空類大小為何為 1?結構體包含指針成員大小計算規則

     編輯:程式設計綜合問答

現象


struct Ca { int *p; };
Ca a;
cout << sizeof(a); // 輸出 4 (32位) 或 8 (64位)

問題:未實例化指針指向的內存,為何結構體有大小?

核心解釋

  • `sizeof(Ca)` 計算的是**結構體對象本身佔用的棧內存大小**,而非其成員指向的堆內存。
  • 成員 `int *p` 是一個**指針變量**,在 32 位系統佔 4 字節,64 位佔 8 字節,存儲地址值。
  • 指針**是否指向有效內存、指向多大內存,不影響結構體大小**。
  • 空結構體 `struct Empty {};` 大小為 1 (C++ 標準保證不同對象地址不同),用於佔位。

內存佈局圖解 (32位)

Ca 實例 (棧上)
+----+----+----+----+
| p (4 bytes)      |  ← 指針變量本身,值為 0x00000000 (未初始化) 或堆地址
+----+----+----+----+
sizeof = 4

擴展:對齊與填充


struct Mixed {
    char c;      // 1 byte
    // 3 bytes padding
    int *p;      // 4 bytes (32位)
    // 0 bytes padding
    double d;    // 8 bytes
}; 
// sizeof = 1 + 3 + 4 + 8 = 16 (典型對齊)

關鍵區別

概念含義
對象大小 (sizeof)對象自身佔用的存儲空間,含所有成員變量 (含指針、引用佔指針大小)、填充字節、虛表指針 (若有虛函數)
指向內存大小指針指向的動態分配區域大小,由 `malloc`/`new` 參數決定,運行時動態變化,編譯期不可知

理解「指針是變量,存地址;指向內存是另一塊區域」是掌握 C/C++ 內存模型的基石。

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