雷火电竞-中国电竞赛事及体育赛事平台

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

C語言

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

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

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

內(nèi)存對(duì)其是VC++程序設(shè)計(jì)中一個(gè)非常重要的技巧,本文即以實(shí)例講述VC++實(shí)現(xiàn)內(nèi)存對(duì)其的方法。具體分析如下:

一、概述

我們經(jīng)常看到求 sizeof(A) 的值的問題,其中A是一個(gè)結(jié)構(gòu)體,類,或者聯(lián)合體。

為了優(yōu)化CPU訪問和優(yōu)化內(nèi)存,減少內(nèi)存碎片,編譯器對(duì)內(nèi)存對(duì)齊制定了一些規(guī)則。但是,不同的編譯器可能有不同的實(shí)現(xiàn),本文只針對(duì)VC++編譯器,這里使用的IDE是VS2012。

#pragma pack()是一個(gè)預(yù)處理,表示內(nèi)存對(duì)齊。布局控制#pragma,為編譯程序提供非常規(guī)的控制流信息。

二、結(jié)構(gòu)體的大小的規(guī)則

結(jié)構(gòu)體大小是處理器位數(shù)和結(jié)構(gòu)體內(nèi)最長(zhǎng)數(shù)據(jù)元素所占字節(jié)數(shù)二者中較小的那一個(gè)的整數(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í)位數(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)體與類只有一個(gè)區(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;
};

此時(shí)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)存對(duì)齊

結(jié)構(gòu)體中數(shù)據(jù)元素所在內(nèi)存地址由兩個(gè)因素決定。

一是#pragma pack(n) 中的n,二是元素類型所占字節(jié)數(shù),sizeof(type),兩者中取較小的一個(gè),元素內(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ù)倍,所以它的起始地址偏移量將會(huì)是6,而不是5。

輸出a, b, c 的地址為

0043FD68

0043FD6C

0043FD6E

可以看到c的起始地址比b的起始地址大了2個(gè)字節(jié),b占了2個(gè)字節(jié)的大小,這是因?yàn)閏的類型是short型,大小為2,而n默認(rèn)是4,sizeof(short) < n,所以偏移量應(yīng)該是2的整數(shù)倍,這里是6.

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

上一篇:數(shù)據(jù)結(jié)構(gòu)之紅黑樹詳解

欄    目:C語言

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

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

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3440.html

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

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

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

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