2、 效能原因:經過記憶體對齊後,cpu的記憶體訪問速度大大提公升。
1.資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是陣列,結構體等)的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存。
2.結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始儲存.)
3.收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊.
/*****************************************
> file name : test1.cpp
> description : 記憶體位元組對齊規則
64bit win7 vs2013
> author : linden
> date : 2016-02-28
*******************************************/
#include "stdafx.h"
#include "iostream"
using
namespace
std;
typedef
struct _a
a;typedef
struct _b
b;int _tmain(int argc, _tchar* argv)
/*****************************************
> file name : test2.cpp
> description : 記憶體位元組對齊規則
64bit win7 vs2013
> author : linden
> date : 2016-02-28
*******************************************/
#include "stdafx.h"
#include "iostream"
using
namespace
std;
typedef
struct _a
a;typedef
struct _b
b;int _tmain(int argc, _tchar* argv)
對a的解釋:char佔乙個位元組,起始偏移為0 ,int 佔4個位元組,min(#pragma pack()指定的數,這個資料成員的自身長度) = 4
(vs預設8位元組對齊),所以int按4位元組對齊,起始偏移必須為4的倍數,所以起始偏移為4,在char後編譯器會新增3個位元組的額外位元組,
不存放任意資料。short佔2個位元組,按2位元組對齊,起始偏移為8,正好是2的倍數,無須新增額外位元組。到此規則1的資料成員對齊結束,此時的記憶體狀態為:
o***|oooo|oo
0123
4567
89 (位址)
(x表示額外新增的位元組)
共佔10個位元組。還要繼續進行結構本身的對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行,
a結構中最大資料成員長度為int,佔4位元組,而預設的#pragma pack 指定的值為8,所以結果本身按照4位元組對齊,結構總大小必須為4的倍數,
需新增2個額外位元組使結構的總大小為12 。此時的記憶體狀態為:
o***|oooo|ooxx
0123
4567
89ab (位址)
到此記憶體對齊結束。a占用了12個位元組而非7個位元組。
位元組對齊規則
四個重要的基本概念。1.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,其自身對齊值為4,double為8單位位元組。2.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。3.指定對齊值 pragma pack value 時的指定對...
記憶體對齊的規則及其作用
首先由乙個程式引入話題 1 環境 vc6 windows sp2 2 程式1 3 include 4 5 using namespace std 6 7 struct st1 8 13 14 struct st2 15 20 21 int main 22 23 cout 程式的輸出結果為 sizeo...
記憶體對齊規則以及作用
首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include 45 using namespace std 6 7struct st1 8 13 14struct st2 15 20 21int main 22 27 程式的輸出結果為 sizeof st1 is 12...