1. 程式人生 > >記憶體對齊方式的總結 如何計算結構體所佔記憶體的大小

記憶體對齊方式的總結 如何計算結構體所佔記憶體的大小

具體的理論內容 神馬是記憶體對齊以及為何要記憶體對齊請看http://blog.csdn.net/kokodudu/article/details/11918219

上面這個連線 將的相當理論 我給簡化了一下 但是還是必須要看的

這裡對如何計算結構體所佔記憶體大小做出總結

1、首先要弄清成員變數有效對齊方式的值 N

這裡面有四個概念值:
1)資料型別自身的對齊值:就是上面交代的基本資料型別的自身對齊值。

2)指定對齊值:#pragma pack (value)時的指定對齊值value。

3)結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

4)資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小的那個值。

2、每個成員的起始地址應滿足 “起始地址%N = 0”

3、根據結構體的有效對齊值圓整(就是結構體成員變數佔用總長度需要是對結構體有效對齊值的整 數倍)

看例子:

 設結構體如下定義:
struct A {
    int a;
    char b;
    short c;
};

按照我們的步驟來: 1、首先確定每個成員的有效對齊值,由於這裡沒有指定對齊值 所以 每個成員的有效對齊值就是其自身資料型別的對齊值

a 的對齊值是 4位元組(32位機上) b 的對齊值是 1位元組 c 的對齊值是2位元組

2、起始地址必須滿足“起始地址%N = 0”

令起始地址位0x0000  按照變數的順序儲存 則 0x0000%4 = 0;滿足條件 佔用4個位元組 0x0000-0x0003 折四個位元組

變數b 的起始地址 是 0x0004%1 = 0滿足條件 佔用一個位元組 就是0x0004

變數c 的起始地址 是 0x0005%2 !=0 所以起始地址要向後移位 知道滿足條件位置 0x0006%2 = 0 滿足條件 佔用2位元組 0x0006-0x0007

總共佔用了8位元組

3、根據結構體的有效對齊值圓整   結構體的有效對齊值是 其成員中自身對齊值最大的那個值 4 由於8位元組正好是4的整數倍 所有就是8位元組

例2、

分析例子B;
struct B {
    char b;
    int a;
    short c;
};

依然按照我們的步驟來:

1、找變數的有效對齊位 還是沒有指定對齊值 所以就是變數自身的對齊值 b 1位元組, a 4位元組,c 2位元組

2、起始地址滿足 對有效對齊值取餘=0的條件 令其實地址為0x0000 % 1 = 0滿足

變數a 的起始地址為0x0001 %4 !=0 則其實地址要向後移位 知道滿足條件為止 0x0004%4 = 0 佔用4個位元組 0x0004-0x0007

變數c 的起始地址為 0x0008 %2 = 0 滿足條件 佔用兩個位元組 0x0008-0x0009

總共佔用了10個位元組的記憶體空間

3、圓整 結構體的有效對齊值是4 所以 總共佔用的硬為(10+2)%4 = 0個位元組 12個位元組

例3、看!!!!!!

Intel、微軟等公司曾經出過一道類似的面試題:
#include <iostream.h>
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack()
int main(int argc, char* argv[])
{
example2 struct2;
cout << sizeof(example1) << endl;
cout << sizeof(example2) << endl;
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;
return 0;
}
問程式的輸入結果是什麼?
答案是:
8
16
4
分析 首先程式指定了記憶體有效對齊值為8

但是結構體和成員的有效對齊值 為自身有效對齊值 和制定有效對齊值的最小的那個值 所以還是變數自身的對齊值

還是按照步驟來:example1 short 2個位元組 long4個位元組

2、 令起始地址為0x0000 則 short佔用兩個位元組 0x0000 -0x0001 long 的起始地址位0x0004 佔用四個位元組 0x0004-0x0007

3、 結構體的有效對齊值為long4 總共的位元組書必須是4的整數倍 則 正好是8位元組

example2 char 1個位元組 example1 為結構體需要將=檢視結構體內的的有效對齊值 4 位元組short 2個位元組

則 2、char起始地址0x0000 佔用一個位元組 結構體的其實地址為 0x0004 佔用8個位元組 0x0004-0x000c short兩個位元組 0

x000e-0x0000f

共16個位元組

3、圓整 必須是有效對齊值得整數倍

所以是16個位元組