欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VC++中內存對齊實例教程

 更新時間:2014年08月23日 10:18:18   投稿:shichen2014  
這篇文章主要介紹了VC++中內存對齊的實現方法,具有很高的實用價值,需要的朋友可以參考下

內存對其是VC++程序設計中一個非常重要的技巧,本文即以實例講述VC++實現內存對其的方法。具體分析如下:

一、概述

我們經??吹角?sizeof(A) 的值的問題,其中A是一個結構體,類,或者聯合體。

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

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

二、結構體的大小的規(guī)則

結構體大小是處理器位數和結構體內最長數據元素所占字節(jié)數二者中較小的那一個的整數倍。

比如說,假設處理器位數為n,結構體內最大數據元素所占字節(jié)數為m。

處理器為32位,n = 4;結構體內最大數據類型為short,m = 2; n > m;結構體大小為m的整數倍,反之亦然。

注意:有些雖然是64位的操作系統(tǒng),但是編譯器卻是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++中的結構體與類只有一個區(qū)別,就是結構體成員默認是public,而類默認是private。

class X{
public:
  double a;
  float b;
  int c;
  char d;
};

sizeof(X)為20,為4(處理器位數)的整數倍。

三、#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))的整數倍。

四、內存對齊

結構體中數據元素所在內存地址由兩個因素決定。

一是#pragma pack(n) 中的n,二是元素類型所占字節(jié)數,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個字節(jié),b占了2個字節(jié)的大小,這是因為c的類型是short型,大小為2,而n默認是4,sizeof(short) < n,所以偏移量應該是2的整數倍,這里是6.

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

相關文章

  • C/C++讀取大文件數據方式詳細講解

    C/C++讀取大文件數據方式詳細講解

    這篇文章主要介紹了C語言/C++讀取大文件數據的完整方式過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • uboot添加自定義命令的實現步驟

    uboot添加自定義命令的實現步驟

    uboot 屬于bootloader的一種,是用來引導啟動內核的,它的最終目的就是從flash中讀出內核,放到內存中,啟動內核,這篇文章主要介紹了uboot添加自定義命令的實現步驟,需要的朋友可以參考下
    2022-11-11
  • C語言雙指針多方法旋轉數組解題LeetCode

    C語言雙指針多方法旋轉數組解題LeetCode

    這篇文章主要為大家介紹了C語言雙指針使用多方法旋轉數組題解LeetCode,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • C++特殊類設計概念與示例講解

    C++特殊類設計概念與示例講解

    本文介紹C++中三種特殊類設計模式:單例模式、工廠模式和代理模式。通過詳細講解每種設計模式的實現原理和應用場景,幫助讀者理解和掌握這些常用的面向對象設計模式,并提供示例代碼和技巧,便于實際應用
    2023-04-04
  • C++設計模式之建造者模式(Builder)

    C++設計模式之建造者模式(Builder)

    這篇文章主要介紹了C++設計模式之建造者模式Builder的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C++獲取多瀏覽器上網歷史記錄示例代碼(支持獲取IE/Chrome/FireFox)

    C++獲取多瀏覽器上網歷史記錄示例代碼(支持獲取IE/Chrome/FireFox)

    這篇文章主要介紹了C++獲取多瀏覽器上網歷史記錄示例代碼,支持獲取IE, Chrome,FireFox等瀏覽器
    2013-11-11
  • c語言計算三角形面積代碼

    c語言計算三角形面積代碼

    c語言計算三角形面積,這只是一個小作業(yè),大家一起學習C語言吧,面積公式s = (a+b+c) / 2 area = sqrt(s * (s - a) * (s - b) * (s - c))
    2013-11-11
  • C++ 數據類型強制轉化的實現

    C++ 數據類型強制轉化的實現

    這篇文章主要介紹了C++ 數據類型強制轉化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • c++ 如何在libuv中實現tcp服務器

    c++ 如何在libuv中實現tcp服務器

    這篇文章主要介紹了c++ 如何在libuv中實現tcp服務器,幫助大家更好的理解和使用libuv,感興趣的朋友可以了解下
    2021-02-02
  • 基于Matlab實現人工神經網絡(ANN)回歸的示例詳解

    基于Matlab實現人工神經網絡(ANN)回歸的示例詳解

    這篇文章主要為大家詳細介紹了Matlab實現人工神經網絡(ANN)回歸的相關資料,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02

最新評論