VC++中內存對齊實例教程。本站提示廣大學習愛好者:(VC++中內存對齊實例教程)文章只能為提供參考,不一定能成為您想要的結果。以下是VC++中內存對齊實例教程正文
內存對其是VC++法式設計中一個異常主要的技能,本文即以實例講述VC++完成內存對其的辦法。詳細剖析以下:
1、概述
我們常常看到求 sizeof(A) 的值的成績,個中A是一個構造體,類,或許結合體。
為了優化CPU拜訪和優化內存,削減內存碎片,編譯器對內存對齊制訂了一些規矩。然則,分歧的編譯器能夠有分歧的完成,本文只針對VC++編譯器,這裡應用的IDE是VS2012。
#pragma pack()是一個預處置,表現內存對齊。結構掌握#pragma,為編譯法式供給異常規的掌握流信息。
2、構造體的年夜小的規矩
構造體年夜小是處置器位數和構造體內最長數據元素所占字節數兩者中較小的那一個的整數倍。
好比說,假定處置器位數為n,構造體內最年夜數據元素所占字節數為m。
處置器為32位,n = 4;構造體內最年夜數據類型為short,m = 2; n > m;構造體年夜小為m的整數倍,反之亦然。
留意:有些固然是64位的操作體系,然則編譯器倒是32位的,此時位數為32.
class A{ int a; char b; short c; }; sizeof(A)為8,為4的整數倍。 struct B{ short a; short b; short c; };
sizeof(B)為6,為2(sizeof(short))的整數倍。
留意:C++中的構造體與類只要一個差別,就是構造體成員默許是public,而類默許是private。
class X{ public: double a; float b; int c; char d; };
sizeof(X)為20,為4(處置器位數)的整數倍。
3、#pragma pack(n)
#pragma pack(n)中的n默許是4,即處置器位數32,但我們可以本身界說它的年夜小。
#pragma pack(1) class A{ public: int a; char b; short c; };
此時sizeof(A)為7,為1(#pragma pack(1))的整數倍。
#pragma pack(1) class X{ public: double a; int b; short c; char d; };
sizeof(X)為15,為1(#pragma pack(1))的整數倍。
#pragma pack(4) class X{ public: double a; int b; short c; char d; };
sizeof(X)為16,為4(#pragma pack(4))的整數倍。
#pragma pack(8) class X{ public: double a; int b; short c; char d; };
sizeof(X)為16,為8(#pragma pack(8) 或許 sizeof(double))的整數倍。
4、內存對齊
構造體中數據元素地點內存地址由兩個身分決議。
一是#pragma pack(n) 中的n,二是元素類型所占字節數,sizeof(type),二者中取較小的一個,元素內存地址到構造體或類的肇端地址的偏移量為較小數的整數倍。
好比#pragma pack(n)默許為4,有以下構造體
struct A{ int a; char b; short c; };
a的肇端地址間隔構造體肇端地址的偏移量為0,是sizeof(int)的整數倍。
b的肇端地址間隔構造體肇端地址的偏移量為4,是sizeof(char)的整數倍。
c的肇端地址間隔構造體肇端地址的偏移量為5,不是sizeof(short)的整數倍,所以它的肇端地址偏移量將會是6,而不是5。
輸入a, b, c 的地址為
0043FD68
0043FD6C
0043FD6E
可以看到c的肇端地址比b的肇端地址年夜了2個字節,b占了2個字節的年夜小,這是由於c的類型是short型,年夜小為2,而n默許是4,sizeof(short) < n,所以偏移量應當是2的整數倍,這裡是6.
願望本文所述對年夜家的VC++法式設計有所贊助。