VC++中內(nèi)存對齊實例教程
內(nèi)存對其是VC++程序設(shè)計中一個非常重要的技巧,本文即以實例講述VC++實現(xiàn)內(nèi)存對其的方法。具體分析如下:
一、概述
我們經(jīng)??吹角?sizeof(A) 的值的問題,其中A是一個結(jié)構(gòu)體,類,或者聯(lián)合體。
為了優(yōu)化CPU訪問和優(yōu)化內(nèi)存,減少內(nèi)存碎片,編譯器對內(nèi)存對齊制定了一些規(guī)則。但是,不同的編譯器可能有不同的實現(xiàn),本文只針對VC++編譯器,這里使用的IDE是VS2012。
#pragma pack()是一個預(yù)處理,表示內(nèi)存對齊。布局控制#pragma,為編譯程序提供非常規(guī)的控制流信息。
二、結(jié)構(gòu)體的大小的規(guī)則
結(jié)構(gòu)體大小是處理器位數(shù)和結(jié)構(gòu)體內(nèi)最長數(shù)據(jù)元素所占字節(jié)數(shù)二者中較小的那一個的整數(shù)倍。
比如說,假設(shè)處理器位數(shù)為n,結(jié)構(gòu)體內(nèi)最大數(shù)據(jù)元素所占字節(jié)數(shù)為m。
處理器為32位,n = 4;結(jié)構(gòu)體內(nèi)最大數(shù)據(jù)類型為short,m = 2; n > m;結(jié)構(gòu)體大小為m的整數(shù)倍,反之亦然。
注意:有些雖然是64位的操作系統(tǒng),但是編譯器卻是32位的,此時位數(shù)為32.
class A{ int a; char b; short c; }; sizeof(A)為8,為4的整數(shù)倍。 struct B{ short a; short b; short c; };
sizeof(B)為6,為2(sizeof(short))的整數(shù)倍。
注意:C++中的結(jié)構(gòu)體與類只有一個區(qū)別,就是結(jié)構(gòu)體成員默認(rèn)是public,而類默認(rèn)是private。
class X{ public: double a; float b; int c; char d; };
sizeof(X)為20,為4(處理器位數(shù))的整數(shù)倍。
三、#pragma pack(n)
#pragma pack(n)中的n默認(rèn)是4,即處理器位數(shù)32,但我們可以自己定義它的大小。
#pragma pack(1) class A{ public: int a; char b; short c; };
此時sizeof(A)為7,為1(#pragma pack(1))的整數(shù)倍。
#pragma pack(1) class X{ public: double a; int b; short c; char d; };
sizeof(X)為15,為1(#pragma pack(1))的整數(shù)倍。
#pragma pack(4) class X{ public: double a; int b; short c; char d; };
sizeof(X)為16,為4(#pragma pack(4))的整數(shù)倍。
#pragma pack(8) class X{ public: double a; int b; short c; char d; };
sizeof(X)為16,為8(#pragma pack(8) 或者 sizeof(double))的整數(shù)倍。
四、內(nèi)存對齊
結(jié)構(gòu)體中數(shù)據(jù)元素所在內(nèi)存地址由兩個因素決定。
一是#pragma pack(n) 中的n,二是元素類型所占字節(jié)數(shù),sizeof(type),兩者中取較小的一個,元素內(nèi)存地址到結(jié)構(gòu)體或類的起始地址的偏移量為較小數(shù)的整數(shù)倍。
比如#pragma pack(n)默認(rèn)為4,有以下結(jié)構(gòu)體
struct A{ int a; char b; short c; };
a的起始地址距離結(jié)構(gòu)體起始地址的偏移量為0,是sizeof(int)的整數(shù)倍。
b的起始地址距離結(jié)構(gòu)體起始地址的偏移量為4,是sizeof(char)的整數(shù)倍。
c的起始地址距離結(jié)構(gòu)體起始地址的偏移量為5,不是sizeof(short)的整數(shù)倍,所以它的起始地址偏移量將會是6,而不是5。
輸出a, b, c 的地址為
0043FD68
0043FD6C
0043FD6E
可以看到c的起始地址比b的起始地址大了2個字節(jié),b占了2個字節(jié)的大小,這是因為c的類型是short型,大小為2,而n默認(rèn)是4,sizeof(short) < n,所以偏移量應(yīng)該是2的整數(shù)倍,這里是6.
希望本文所述對大家的VC++程序設(shè)計有所幫助。
上一篇:數(shù)據(jù)結(jié)構(gòu)之紅黑樹詳解
欄 目:C語言
本文標(biāo)題:VC++中內(nèi)存對齊實例教程
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3440.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10如何查看進(jìn)程實際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置