国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

VC++中內(nèi)存對齊實例教程

2020-01-26 15:22:34
字體:
供稿:網(wǎng)友

內(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)體成員默認是public,而類默認是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默認是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)默認為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默認是4,sizeof(short) < n,所以偏移量應(yīng)該是2的整數(shù)倍,這里是6.

希望本文所述對大家的VC++程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 安阳县| 佛冈县| 襄樊市| 襄樊市| 隆安县| 东乡族自治县| 裕民县| 青浦区| 保山市| 阿坝| 泾源县| 霍州市| 谢通门县| 安宁市| 铜陵市| 舞钢市| 维西| 凌海市| 汉中市| 灌南县| 福清市| 民县| 贵州省| 都安| 唐山市| 虹口区| 长乐市| 翁牛特旗| 台州市| 利津县| 石台县| 托里县| 临邑县| 津市市| 遂川县| 淮安市| 高安市| 筠连县| 平陆县| 瑞金市| 宾川县|