最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析C語言中結(jié)構(gòu)體struct的對齊問題

 更新時間:2016年04月20日 11:12:18   投稿:goldensun  
這篇文章主要介紹了C語言中結(jié)構(gòu)體struct的對齊問題,作者深入到內(nèi)存分配方面來進行解析,需要的朋友可以參考下

首先看一下結(jié)構(gòu)體對齊的三個概念值:

數(shù)據(jù)類型的默認對齊值(自身對齊):
1.基本數(shù)據(jù)類型:為指定平臺上基本類型的長度。如在32位機器中,char對齊值為1,short為2,int,float為4,double為8;
結(jié)構(gòu)體:其數(shù)據(jù)成員中默認對齊值最大的那個值。
2.指定對齊值:#pragma pack (value)時的指定對齊值value。
3.數(shù)據(jù)類型的有效對齊值:默認對齊值和指定對齊值中小的那個值。
有了這些值,我們就可以很方便的來討論具體數(shù)據(jù)結(jié)構(gòu)的成員和其自身的對齊方式。有效對齊值N是最終用來決定數(shù)據(jù)存放地址方式的值,最重要。有效對齊N,就是表示“對齊在N上”,也就是說該數(shù)據(jù)的“偏移量%N=0”。而數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)變量都是按定義的先后順序來排放的。第一個數(shù)據(jù)變量的起始地址就是數(shù)據(jù)結(jié)構(gòu)的起始地址。結(jié)構(gòu)體的成員變量要對齊排放(對于非對齊成員需要在其前面填充一些字節(jié),保證其在對齊位置上),結(jié)構(gòu)體本身也要根據(jù)自身的有效對齊值圓整(就是結(jié)構(gòu)體總長度需要是結(jié)構(gòu)體有效對齊值的整數(shù)倍)。

通過上面的分析,對結(jié)構(gòu)體進行字節(jié)對齊,我們需要知道四個值:

  • 指定對齊值:代碼中指定的對齊值,記為packLen;
  • 默認對齊值:結(jié)構(gòu)體中每個數(shù)據(jù)成員及結(jié)構(gòu)體本身都有默認對齊值,記為defaultLen;
  • 成員偏移量:即相對于結(jié)構(gòu)體起始位置的長度,記為offset;
  • 成員長度:結(jié)構(gòu)體中每個數(shù)據(jù)成員的長度(注結(jié)構(gòu)體成員為補齊之后的長度),記為memberLen。

及兩個規(guī)則:

1.對齊規(guī)則:
offset % vaildLen = 0,其中vaildLen為有效對齊值vaildLen = min(packLen, defaultLen);

2.填充規(guī)則:
如成員變量不遵守對齊規(guī)則,則需要對其補齊;在其前面填充一些字節(jié)保證該成員對齊。需填充的字節(jié)數(shù)記為padLen:

padLen = getPadLen(offset , defaultLen);
int getPadLen(int offsetLen, int defaultLen)
{
  int vaildLen = min(packLen,defaultLen);
  if(0 == vaildLen || 0 == offsetLen % vaildLen)
  {
    return 0;
  }
  return vaildLen - (offsetLen % vaildLen);
}

結(jié)構(gòu)體對齊算法思想:深度優(yōu)先填充

先對齊內(nèi)層結(jié)構(gòu)體;
對每個數(shù)據(jù)成員計算其defaultLen、memberLen和offset;

再遍歷每個數(shù)據(jù)成員時計算;
對于基本數(shù)據(jù)類型成員defaultLen=memberLen;對于結(jié)構(gòu)體成員defaultLen等于它的所有成員的最大的memberLen;
遍歷時對成員的memberLen進行累加,得到當前成員的offsetLen;
運用對齊及填充規(guī)則:在當前結(jié)構(gòu)體成員前填充padLen個字節(jié);


舉例說明:

struct{

 short a;

 short b;

 short c; }A; sizeof(A) = 6; 

(vc6與gcc相同)

struct{

 long a;

 short c; }A; sizeof(A) = 8;

(vc6與gcc相同), 它的內(nèi)存分配為: a1 a2 a3 a4 , c1 c2 x x(a1為a的第一個字節(jié),x為補齊字節(jié),下同)

struct{

int a;

char b;

short c; }A;

sizeof(A) = 8;

A的內(nèi)存分配為:

 a1 a2 a3 a4, b1 x c1 c2
struct{

char a;

int b;

short c; }A1;

sizeof(A1) = 12;

(vc6與gcc相同)

A1的內(nèi)存分配為:

a1 x x x, b1 b2 b3 b4, c1 c2 x x

下面是更復雜的情況,結(jié)構(gòu)體作為成員

struct{

int a;

doubl b;

short c; }A; // sizeof(A) = 24 (vc6與gcc相同)

struct{

  char a,b;

int c;

double d;

short e;

struct A h;

}B;

sizeof(B) = 48 //(vc6與gcc相同)

A的內(nèi)存分布:

a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x x

B的內(nèi)存分布:

a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x 

相關(guān)文章

  • C++簡單又輕松建立鏈式二叉樹流程

    C++簡單又輕松建立鏈式二叉樹流程

    二叉樹的鏈式存儲結(jié)構(gòu)是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關(guān)系。通常的方法是鏈表中每個結(jié)點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結(jié)點左孩子和右孩子所在的鏈結(jié)點的存儲地址
    2022-06-06
  • OpenMP深入剖析reduction子句教程

    OpenMP深入剖析reduction子句教程

    這篇文章主要為大家介紹了OpenMP深入剖析reduction子句教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 深入C++拷貝構(gòu)造函數(shù)的總結(jié)詳解

    深入C++拷貝構(gòu)造函數(shù)的總結(jié)詳解

    本篇文章是對C++中拷貝構(gòu)造函數(shù)進行了總結(jié)與介紹。需要的朋友參考下
    2013-05-05
  • 關(guān)于C語言函數(shù)strstr()的分析以及實現(xiàn)

    關(guān)于C語言函數(shù)strstr()的分析以及實現(xiàn)

    以下是對C語言中strstr()函數(shù)的使用進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++中virtual繼承的深入理解

    C++中virtual繼承的深入理解

    本篇文章是對C++中的virtual繼承進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言驅(qū)動開發(fā)之內(nèi)核文件的讀寫

    C語言驅(qū)動開發(fā)之內(nèi)核文件的讀寫

    這篇文章主要為大家詳細介紹了C語言驅(qū)動開發(fā)中內(nèi)核文件的讀寫的系列函數(shù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • 淺談C語言轉(zhuǎn)義字符和格式控制符

    淺談C語言轉(zhuǎn)義字符和格式控制符

    下面小編就為大家?guī)硪黄獪\談C語言轉(zhuǎn)義字符和格式控制符。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • windows下用c++獲取本機ip地址的三種方法

    windows下用c++獲取本機ip地址的三種方法

    工作過程中遇到一個需求,需要獲取本機ip地址,同時獲取本機網(wǎng)絡(luò)連接情況,即網(wǎng)線是否連接,經(jīng)過多番搜索,本文給大家介紹了3種方案,通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Qt之QTimer使用及技巧小結(jié)

    Qt之QTimer使用及技巧小結(jié)

    QTimer是Qt中的定時器類,用于執(zhí)行定時操作,如在一段時間間隔后觸發(fā)某個槽函數(shù)或執(zhí)行特定的代碼,下面就來介紹一下Qt之QTimer使用及技巧小結(jié),感興趣的可以了解一下
    2023-10-10
  • ACE反應器(Reactor)模式的深入分析

    ACE反應器(Reactor)模式的深入分析

    本篇文章是對ACE反應器(Reactor)模式進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

潍坊市| 临朐县| 祥云县| 偃师市| 丹江口市| 中阳县| 肥城市| 碌曲县| 乾安县| 内乡县| 云南省| 博罗县| 盐亭县| 新疆| 博野县| 合水县| 道真| 饶阳县| 肇源县| 广河县| 东山县| 华安县| 乐都县| 莱州市| 沙湾县| 台江县| 永川市| 深圳市| 五台县| 综艺| 高邑县| 达尔| 福贡县| 胶州市| 司法| 寿宁县| 东莞市| 无为县| 体育| 花垣县| 弥渡县|