sizeof運算符詳解及對象大小

sizeof 是運算符,而不是函數。雖然咱們習慣sizeof(...),但( )並非必需的,它只是表示優先級。咱們把sizeof後面的目標叫對象或者操做數。本文約定就叫sizeof對象。c++


  1. 當sizeof 的對象是表達式時,求的大小是表達式返回值的類型大小,但並不計算表達式的值數組

  2. 一樣若是對象是函數,則返回函數返回值類型大小,也不執行函數體函數

  3. 注意sizeof 對象是指針和數組的區別。spa

    當sizeof的對象是數組時,返回數組總大小,而當對象是指針時,返回指針自己的大小,而不是指示內存空間的大小;指針

    但注意:當數組名做爲實參傳入函數時,會自動轉化爲指針類型;但並不影響形參的類型;
    對象

  4. sizeof 沒法獲取動態分配的內存大小,即便用malloc動態的分配內存,沒法使用sizeof獲取其大小。內存

  5. 關於結構體類型編譯器

    理論上一個結構體所佔空間是全部成員的大小總和,但因爲考慮到對齊問題,會有填充字節。編譯

    1、結構體默認按天然對界對齊;數據

    2、#pragma pack(n)規定的對齊長度,實際使用的規則是:
        1)結構,聯合,或者類的數據成員第一個放在偏移爲0的地方,之後每一個數據成員的對齊,起始位置必須是對齊模數的整數倍。對齊模數是#pragma pack指定的數值和數據成員的
    長度中比較小的那個。就是說,當#pragma pack的值等於或超過全部數據成員長度的時候,這個值的大小將不產生任何效果。
        2) 結構體的對齊按照結構體中size最大的數據成員和#pragma pack指定值之間,
    較小的那個進行

    eg:pack(4) struct a{int c1; char c2; char c3;}; 大小爲8字節    pack(4) struct b{int c1; char c2; int c3;};大小爲12字節

  6. 關於類

    空類的大小爲1字節;空類型實例中不包含任何信息,應該大小爲0. 可是當咱們聲明該類型的實例的時候,它必須在內存中佔有必定的空間,不然沒法使用這些實例。至於佔用多少內存,由編譯器決定。g++中每一個空類型的實例佔1字節空間。注意空struct即空類,這就是爲何c++的空struct佔一個字節的緣由。

    含有虛函數的類要加一個虛表指針的大小,32位系統下爲4字節,64位下爲8字節;

相關文章
相關標籤/搜索