計算規則
首先需要介紹有效對齊值:每個平台上的編譯器都有預設對齊係數n,可以通過#pragma pack(n)來指定。有效對齊值就等與該對齊係數和結構體中最長的資料型別的長度兩者最小的那乙個值,比如對齊係數是8,而結構體中最長的是int,4個位元組,那麼有效對齊值為4。
結構體的記憶體計算方式遵循以下規則:
1.資料成員對齊規則:第乙個資料成員放在offset為0的地方,以後的每乙個成員的offset都必須是該成員的大小與有效對齊值相比較小的數值的整數倍,例子1中第乙個資料成員是int 型,第二個是double,有效對齊值為8,所以double的起始位址應該為8,所以第乙個int加上記憶體補齊用了8個位元組
2.結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部有效對齊值的整數倍位址開始儲存。(比如struct a中存有struct b,b裡有char, int, double,那b應該從8的整數倍開始儲存)
3.收尾工作:結構體的總大小,必須是其有效對齊值的整數倍,不足的要補齊。
#include int main()
test;
test e;
printf("%d", sizeof(test));
return 0;
}
輸出的結果為:32
#include int main()
test;
test e;
printf("%d", sizeof(test));
return 0;
}
輸出的結果為:24 結構體對齊計算方式
結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。由於儲存變數位址對齊的問題,結構體大小計算必須滿足兩條原則 一 結構體成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 二 結構體大小必須是所有成員大小的整數倍 陣列除外,結構體中的結構體按單個變數...
結構體大小方式計算
我們實際生活中,儲存的資料一般不會是同一種型別,所以引入了結構體。而結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式很浪費空間,可按照計算機的訪問規則,這種對齊方式提公升了效率。結構體成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 結構...
計算結構體占用記憶體,sizeof,指標。
結構體占用內存在好多地方被提及到,特別是在c語言大型開發專案中,利用指標加偏移量來定義乙個新的指標。另外在校招中也經常被提起,這幾天剛好有人問,拿出來研究一下。在討論結構體內存占用情況之前,先說明一下位元組對齊,正是由於有位元組對齊,有一些看似占用一樣記憶體的結構體實際占用記憶體不同。計算機的記憶體...