欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

內(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語言

下一篇:C/C++常用函數(shù)易錯點分析

本文標(biāo)題:VC++中內(nèi)存對齊實例教程

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3440.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有