文章轉自:http://blog.csdn.net/grantxx/article/details/7577730
文章不錯,通俗易懂,特此分享。
一個結構體變量定義完之後,其在內存中的存儲並不等於其所包含元素的寬度之和。
例一:
#include <iostream>
using namespace std;
struct X
{
char a;
int b;
double c;
}S1;
void main()
{
cout << sizeof(S1) << endl;
cout << sizeof(S1.a) << endl;
cout << sizeof(S1.b) << endl;
cout << sizeof(S1.c) << endl;
}
比如例一中的結構體變量S1定義之後,經測試,會發現sizeof(S1)= 16,其值不等於sizeof(S1.a) = 1、sizeof(S1.b) = 4和 sizeof(S1.c) = 8三者之和,這裡面就存在存儲對齊問題。
原則一:結構體中元素是按照定義順序一個一個放到內存中去的,但並不是緊密排列的。從結構體存儲的首地址開始,每一個元素放置到內存中時,它都會認為內存是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變量首地址為0計算)。
比如此例,首先系統會將字符型變量a存入第0個字節(相對地址,指內存開辟的首地址);然後在存放整形變量b時,會以4個字節為單位進行存儲,由於第一個四字節模塊已有數據,因此它會存入第二個四字節模塊,也就是存入到4~8字節;同理,存放雙精度實型變量c時,由於其寬度為8,其存放時會以8個字節為單位存儲,也就是會找到第一個空的且是8的整數倍的位置開始存儲,此例中,此例中,由於頭一個8字節模塊已被占用,所以將c存入第二個8字節模塊。整體存儲示意圖如圖1所示。
考慮另外一個實例。
例二:
struct X
{
char a;
double b;
int c;