娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

1、對(duì)齊算法


在相同的對(duì)齊方式下,結(jié)構(gòu)體內(nèi)部數(shù)據(jù)定義的順序不同,結(jié)構(gòu)體整體占據(jù)內(nèi)存空間也不同。


如下結(jié)構(gòu)體定義:


struct A {

// a 的自身對(duì)齊值為 4,偏移地址為 0x00~0x03,a 的起始地址 0x00 滿足 0x00%4=0

int a;

 

// b 的自身對(duì)齊值為 1,由于緊跟 a 之后的地址,即 0x04 滿足 0x04%1=0,所以 b 存放在 0x04 地址空間

char b;

 

// c的自身對(duì)齊值為2,由于緊跟b之后的地址0x05%2不是0,而0x06%2=0

// 因此c的存放起始地址為0x06,存放在0x06~0x07空間。

// 在b和c之間的0x05地址則補(bǔ)空字節(jié)

short c;

};

結(jié)構(gòu)體A中包含:


1)4 字節(jié)長(zhǎng)度的 int;


2)1 字節(jié)長(zhǎng)度的 char;


3)2 字節(jié)長(zhǎng)度的 short 型數(shù)據(jù)一個(gè)。


所以 A 用到的空間應(yīng)該是 7 字節(jié)。


但是因?yàn)?a href="http://www.nncyjs.com/zhuanti/vv5yz9" style="color:#4595e6;" target="_blank">編譯器要對(duì)數(shù)據(jù)成員在空間上進(jìn)行對(duì)齊,由于結(jié)構(gòu)體自身對(duì)齊值取數(shù)據(jù)成員中自身對(duì)齊值的最大值,即 4,并且 0x00~0x07 的 8 字節(jié)空間滿足 8%4=0,所以 sizeof(strcut A) 值為 8。


現(xiàn)在把該結(jié)構(gòu)體調(diào)整成員變量的順序:


struct B {

// b的自身對(duì)齊值為1,其起始地址為0x00,由于滿足0x00%1=0,所以b存放在0x00地址空間

char b;

 

// a的自身對(duì)齊值為4,由于緊跟b之后的地址0x01%4不是0,而0x04%4=0

// 因此c的存放起始地址為0x04,存放在0x04~0x07空間。

// 在b和a之間的0x01~0x03地址則補(bǔ)3個(gè)空字節(jié)。

int a;

 

// c的自身對(duì)齊值為2,由于緊跟a之后的地址0x08%2=0,因此c的存放起始地址為0x08,存放在0x08~0x09空間        

short c;          

};

這時(shí)候同樣是總共7個(gè)字節(jié)的變量,但是由于結(jié)構(gòu)體自身對(duì)齊值取數(shù)據(jù)成員中自身對(duì)齊值的最大值,即4;


并且0x00~0x09的10字節(jié)空間不滿足10%4=0,而12%4=0,所以sizeof(struct B)的值卻是12,即在緊跟c之后的0x0A~0x0B地址還需補(bǔ)兩個(gè)空字節(jié),使得整個(gè)結(jié)構(gòu)體占用的字節(jié)空間為12個(gè)字節(jié)。

 

下面我們使用預(yù)編譯指令#pragma pack (value)來(lái)告訴編譯器,使用我們指定的對(duì)齊值來(lái)取代缺省的。


#pragma pack (2) /*指定按2字節(jié)對(duì)齊,等價(jià)于#pragma pack(push,2)*/

struct C {

char b;

int a;

short c;

};

#pragma pack () /*取消指定對(duì)齊,恢復(fù)缺省對(duì)齊,等價(jià)于#pragma pack(pop)*/

sizeof(struct C) 值是8。


修改對(duì)齊值為1:


#pragma pack (1) /*指定按1字節(jié)對(duì)齊*/

struct D {

char b;

int a;

short c;

};

#pragma pack () /*取消指定對(duì)齊,恢復(fù)缺省對(duì)齊*/


sizeof(struct D) 值為7。


對(duì)于char型數(shù)據(jù),其自身對(duì)齊值為1,對(duì)于short型為2,對(duì)于int,float,long類型,其自身對(duì)齊值為4,double,long long類型,其自身對(duì)齊值為8單位字節(jié)。


2、四個(gè)概念值


1)數(shù)據(jù)類型自身的對(duì)齊值,就是上面交代的基本數(shù)據(jù)類型的自身對(duì)齊值;


2)指定對(duì)齊值:#pragma pack (value)時(shí)的指定對(duì)齊值value;


3)結(jié)構(gòu)體或者類的自身對(duì)齊值:其數(shù)據(jù)成員中自身對(duì)齊值最大的那個(gè)值;


4)數(shù)據(jù)成員、結(jié)構(gòu)體和類的有效對(duì)齊值:自身對(duì)齊值和指定對(duì)齊值中小的那個(gè)值;


有了這些值,我們就可以很方便的來(lái)討論具體數(shù)據(jù)結(jié)構(gòu)的成員和其自身的對(duì)齊方式。


有效對(duì)齊值N是最終用來(lái)決定數(shù)據(jù)存放地址方式的值,最重要。


有效對(duì)齊N,就是表示“對(duì)齊在N上”,也就是說(shuō)該數(shù)據(jù)的"存放起始地址%N=0"。


而數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)變量都是按定義的先后順序來(lái)排放的。


第一個(gè)數(shù)據(jù)變量的起始地址就是數(shù)據(jù)結(jié)構(gòu)的起始地址。


結(jié)構(gòu)體的成員變量要對(duì)齊排放,結(jié)構(gòu)體本身也要根據(jù)自身的有效對(duì)齊值圓整,就是結(jié)構(gòu)體成員變量占用總長(zhǎng)度需要是對(duì)結(jié)構(gòu)體有效對(duì)齊值的整數(shù)倍。


這樣就不難理解上面的幾個(gè)例子的值了。


例子分析:


struct B {

char b;

int a;

short c;

};

假設(shè)B從地址空間0x0000開(kāi)始排放。


該例子中沒(méi)有定義指定對(duì)齊值,該值默認(rèn)為4。


第一個(gè)成員變量b的自身對(duì)齊值是1,比指定或者默認(rèn)指定對(duì)齊值4小,所以其有效對(duì)齊值為1,所以其存放地址0x0000符合0x0000%1=0.


第二個(gè)成員變量a,其自身對(duì)齊值為4,所以有效對(duì)齊值也為4,所以只能存放在起始地址為0x0004到0x0007這四個(gè)連續(xù)的字節(jié)空間中,符合0x0004%4=0, 且緊靠第一個(gè)變量。


第三個(gè)變量c,自身對(duì)齊值為2,所以有效對(duì)齊值也是2,可以存放在0x0008到0x0009這兩個(gè)字節(jié)空間中,符合0x0008%2=0。所以從0x0000到0x0009存放的都是B內(nèi)容。


再看數(shù)據(jù)結(jié)構(gòu)B的自身對(duì)齊值為其變量中最大對(duì)齊值(這里是a)和指定對(duì)齊值(這里是4)中較小的那個(gè),所以就是4,所以結(jié)構(gòu)體的有效對(duì)齊值也是4。


根據(jù)結(jié)構(gòu)體圓整的要求,0x0009到0x0000=10字節(jié),(10+2)%4=0。


所以0x0000A到0x000B也為結(jié)構(gòu)體B所占用,故B從0x0000到0x000B共有12個(gè)字節(jié),sizeof(struct B)=12;、


#pragma pack (2) /*指定按2字節(jié)對(duì)齊*/

struct C {

char b;

int a;

short c;

};

#pragma pack () /*取消指定對(duì)齊,恢復(fù)缺省對(duì)齊*/


第一個(gè)變量b的自身對(duì)齊值為1,指定對(duì)齊值為2,所以,其有效對(duì)齊值為1,假設(shè)C從0x0000開(kāi)始,那么b存放在0x0000,符合0x0000%1=0;


第二個(gè)變量,自身對(duì)齊值為4,指定對(duì)齊值為2,所以有效對(duì)齊值為2,所以順序存放在0x0002、0x0003、0x0004、0x0005四個(gè)連續(xù)字節(jié)中,符合0x0002%2=0。


第三個(gè)變量c的自身對(duì)齊值為2,所以有效對(duì)齊值為2,順序存放在0x0006、0x0007中,符合0x0006%2=0。

所以從0x0000到0x00007共八字節(jié)存放的是C的變量,又C的自身對(duì)齊值為4;

所以C的有效對(duì)齊值為2。又8%2=0,C只占用0x0000到0x0007的八個(gè)字節(jié)。所以sizeof(struct C)=8.

 

更改c編譯器的缺省字節(jié)對(duì)齊方式:


在缺省情況下,c編譯器為每一個(gè)變量或數(shù)據(jù)單元按其自然對(duì)界條件分配空間;


一般地可以通過(guò)下面的兩種方法來(lái)改變?nèi)笔〉膶?duì)界條件:


方法一:


使用#pragma pack(n),指定c編譯器按照n個(gè)字節(jié)對(duì)齊;

使用#pragma pack(),取消自定義字節(jié)對(duì)齊方式。


方法二:


__attribute(aligned(n)),讓所作用的數(shù)據(jù)成員對(duì)齊在n字節(jié)的自然邊界上;


如果結(jié)構(gòu)中有成員的長(zhǎng)度大于n,則按照最大成員的長(zhǎng)度來(lái)對(duì)齊;


__attribute((packed)),取消結(jié)構(gòu)在編譯過(guò)程中的優(yōu)化對(duì)齊,按照實(shí)際占用字節(jié)數(shù)進(jìn)行對(duì)齊。


比如:


typedef struct

 

{

  ...

 

}__attribute__((aligned(4))) param_t;

3、示例


例子一:


#pragma pack(4)

class TestB

{

   public:

   int aa;   //第一個(gè)成員,放在[0,3]偏移的位置,

  char a;    //第二個(gè)成員,自身長(zhǎng)為1,#pragma pack(4),取小值,也就是1,所以這個(gè)成員按一字節(jié)對(duì)齊,放在偏移[4]的位置。由于下一成員short b是按2字節(jié)對(duì)齊,因此char a后面只需補(bǔ)一個(gè)空字節(jié)

  short b; //第三個(gè)成員,自身長(zhǎng)2,#pragma pack(4),取小值為2,按2字節(jié)對(duì)齊,所以放在偏移[6,7]的位置。

  char c;   //第四個(gè),自身長(zhǎng)為1,放在[8]的位置。

};

可見(jiàn),此類實(shí)際占用的內(nèi)存空間是9個(gè)字節(jié)。


根據(jù)規(guī)則5,結(jié)構(gòu)整體的對(duì)齊是min( sizeof( int ), pack_value ) = 4,所以sizeof( TestB ) = 12; 


char a 占用一個(gè)字節(jié),后面補(bǔ)3個(gè)空字節(jié);


short b和char c可以放在同一4字節(jié)空間中,后面只需補(bǔ)一個(gè)空字節(jié)。


例子二:


#pragma pack(2)

class TestB

{

   public:

      int aa;   //第一個(gè)成員,放在[0,3]偏移的位置,

  char a;   //第二個(gè)成員,自身長(zhǎng)為1,#pragma pack(4),取小值,也就是1,所以這個(gè)成員按一字節(jié)對(duì)齊,放在偏移[4]的位置。由于下一成員short b按2字節(jié)對(duì)齊,因此char a后面只需補(bǔ)一個(gè)空字節(jié)

  short b; //第三個(gè)成員,自身長(zhǎng)2,#pragma pack(4),取2,按2字節(jié)對(duì)齊,所以放在偏移[6,7]的位置。

  char c;   //第四個(gè),自身長(zhǎng)為1,放在[8]的位置。

};

可見(jiàn)結(jié)果與例子一相同,各個(gè)成員的位置沒(méi)有改變,此時(shí)結(jié)構(gòu)整體的對(duì)齊是min( sizeof( int ), pack_value ) = 2,所以sizeof( TestB ) = 10;char a后面補(bǔ)一個(gè)空字節(jié);char c后面補(bǔ)一個(gè)空字節(jié)。


例子三:


#pragma pack(4)

class TestC

{

  public:

     char a;    //第一個(gè)成員,放在[0]偏移的位置,由于下一成員short b按2字節(jié)對(duì)齊,因此char a后面只弱補(bǔ)一個(gè)空字節(jié)

  short b; //第二個(gè)成員,自身長(zhǎng)2,#pragma pack(4),取2,按2字節(jié)對(duì)齊,所以放在偏移[2,3]的位置。

  char c;   //第三個(gè),自身長(zhǎng)為1,放在[4]的位置。

};

整個(gè)類的實(shí)際內(nèi)存消耗是5個(gè)字節(jié),整體按照min( sizeof( short ), 4 ) = 2對(duì)齊,所以結(jié)果是sizeof( TestC ) = 6。


例子四:


struct Test

{

    char x1;   //第一個(gè)成員,放在[0]位置。由于下一成員short x2按2字節(jié)對(duì)齊,因此char x1后面只需補(bǔ)一個(gè)空字節(jié),

    short x2; //第二個(gè)成員,自身長(zhǎng)度為2,按2字節(jié)對(duì)齊,所以放在偏移[2,3]的位置,

    float x3;  //第三個(gè)成員,自身長(zhǎng)度為4,按4字節(jié)對(duì)齊,所以放在偏移[4,7]的位置,

    char x4;  //第四個(gè)成員,自身長(zhǎng)度為1,按1字節(jié)對(duì)齊,所以放在偏移[8]的位置,

};

所以整個(gè)結(jié)構(gòu)體的實(shí)際內(nèi)存消耗是9個(gè)字節(jié),考慮到結(jié)構(gòu)整體的對(duì)齊是4個(gè)字節(jié),所以整個(gè)結(jié)構(gòu)占用的空間是12個(gè)字節(jié)。char x1和short x2共用一個(gè)4字節(jié)空間,后面補(bǔ)一個(gè)空字節(jié);char x4后面需要補(bǔ)3個(gè)空字節(jié)。


例子五:


#pragma pack(8)

 

struct s1

{

    short a; //第一個(gè),放在[0,1]位置,

    long b;  //第二個(gè),自身長(zhǎng)度為4,按min(4, 8) = 4對(duì)齊,所以放在[4,7]位置

};

所以結(jié)構(gòu)體的實(shí)際內(nèi)存消耗是8個(gè)字節(jié);


結(jié)構(gòu)體的對(duì)齊是min( sizeof( long ), pack_value ) = 4字節(jié),所以整個(gè)結(jié)構(gòu)占用的空間是8個(gè)字節(jié)。


struct s2

{

char c;         //第一個(gè),放在[0]位置,

s1 d;           //第二個(gè),根據(jù)規(guī)則四,對(duì)齊是min( 4, pack_value ) = 4字節(jié)(由于s1占用了8個(gè)字節(jié),這里為什么不是8字節(jié)??),所以放在[4,11]位置,

long long e; //第三個(gè),自身長(zhǎng)度為8字節(jié),所以按8字節(jié)對(duì)齊,所以放在[16,23]位置,

};

所以實(shí)際內(nèi)存消耗是24字節(jié)。整體對(duì)齊方式是8字節(jié),所以整個(gè)結(jié)構(gòu)占用的空間是24字節(jié)。


#pragma pack()


所以:sizeof(s2) = 24, char c后面是空了3個(gè)字節(jié)接著是s1 d, s1 d后面又補(bǔ)了4個(gè)空字節(jié),char c占一個(gè)字節(jié),后面補(bǔ)7個(gè)字節(jié);s1 d占8個(gè)字節(jié);long long e占8個(gè)字節(jié)。



refer:


https://www.cnblogs.com/King-Gentleman/p/5297355.html


關(guān)鍵字:STM32  結(jié)構(gòu)體  對(duì)齊規(guī)則 引用地址:STM32 結(jié)構(gòu)體對(duì)齊規(guī)則

上一篇:STM32 啟動(dòng)代碼匯編指令詳解
下一篇:STM32 編譯指令 #pragma pack 的配對(duì)使用

推薦閱讀

慈溪毛豆收割機(jī)無(wú)人植保飛機(jī)西蘭花移栽作業(yè)近一個(gè)月來(lái),全國(guó)首批“平安農(nóng)機(jī)”示范市、全國(guó)主要農(nóng)作物生產(chǎn)全程機(jī)械化示范縣(市、區(qū))、全省機(jī)器換人示范縣等“大獎(jiǎng)”接連花落寧波市及各區(qū)縣(市),一個(gè)個(gè)榮譽(yù)的背后是農(nóng)民獲得的更多實(shí)惠。“鋤禾日當(dāng)午,汗滴禾下土”。伴隨我們長(zhǎng)大的《憫農(nóng)》一詩(shī),描繪了農(nóng)民頂烈日、灑汗水辛勤勞作的畫(huà)面。時(shí)代在變,農(nóng)...
在2004年由威爾·史密斯主演的科幻大片《我,機(jī)器人》中,片中的機(jī)器人公司亮出了一句響亮的廣告詞——“2035年,這是個(gè)機(jī)器的時(shí)代。”而現(xiàn)實(shí)生活中,機(jī)器手雖然在自動(dòng)生產(chǎn)線等領(lǐng)域有越來(lái)越廣泛的應(yīng)用,但它依然是冷冰冰工具的形象,具有高度智慧的機(jī)器人離普通人的生活依舊遙遠(yuǎn)。不過(guò),隨著近兩年人工智能迎來(lái)了一段爆發(fā)性成長(zhǎng)之后,機(jī)器具備了更精準(zhǔn)地獲...
內(nèi)容說(shuō)明本發(fā)明涉及流量計(jì)量領(lǐng)域,特別是涉及一種自充電式電磁流量計(jì)。發(fā)明背景智能化水表取代老式機(jī)械式計(jì)量水表已是大勢(shì)所驅(qū),而目前智能水表中都采用一次性電池為控制電子電路供電。例如,在申請(qǐng)?zhí)枮?00510049943 .4的中國(guó)專利文獻(xiàn)中,公開(kāi)了一種電池供電電磁流量計(jì),其流量測(cè)量回路與內(nèi)置于電磁流量計(jì)的電池供電回路相連,其電源供電穩(wěn)定,電壓變化能...
51單片機(jī)脈搏測(cè)量?jī)x電路圖和源程序脈搏測(cè)量?jī)x的源程序#includeunsigned char i,j,t,m,DelayTime,DispBuf[3];//單片機(jī)脈搏測(cè)量?jī)x源程序//作者:吳漢清unsigned int n,mb;unsigned char codeBitTab[3]={0xf7,0xef,0xdf};//位驅(qū)動(dòng)碼unsigned char codeDispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形碼sbit P3_0=P3^0;void...

史海拾趣

問(wèn)答坊 | AI 解惑

[下載]電子設(shè)計(jì)1000例

美國(guó)國(guó)家半導(dǎo)體出品的電路設(shè)計(jì)參考軟件,配有國(guó)半芯片應(yīng)用的原理圖和簡(jiǎn)單說(shuō)明,是設(shè)計(jì)電路中極好的參考 英文版+漢化(菜單)的,有興趣的同仁下了瞧一瞧,或許很有用哦 解壓后雙擊文件中的ENCYC.EXE就打開(kāi)了^_^ …

查看全部問(wèn)答∨

智能家居經(jīng)銷商心理要素分析

前提要素:執(zhí)著的信念     對(duì)于絕大多數(shù)經(jīng)銷商而言,目前的國(guó)內(nèi)智能家居市場(chǎng)還處于一個(gè)待發(fā)展的態(tài)勢(shì),自身企業(yè)的盈利水平尚未處于高位,眼見(jiàn)安防、布線、照明等成熟行業(yè)商家經(jīng)營(yíng)順風(fēng)順?biāo)耐瑫r(shí),自然不可避免的流露出幾分羨慕之情,但比 ...…

查看全部問(wèn)答∨

急啊!單片機(jī)串口通信程序問(wèn)題!

急啊!單片機(jī)串口通信程序問(wèn)題! 編譯沒(méi)有通過(guò),還沒(méi)找出原因,請(qǐng)高手指點(diǎn)一下。 是不是程序結(jié)構(gòu)有問(wèn)題!請(qǐng)高手指點(diǎn)哈。在此謝謝大家啦! /************************************************************************************************* ...…

查看全部問(wèn)答∨

linux下,fpga代碼,rbf文件下載的問(wèn)題

下載時(shí)用到幾根管腳分別是:nConfig,nStatus,nConfigDown,DCLK,DATA 我根據(jù)手冊(cè)寫好時(shí)序,在rbf文件<= 128K 的時(shí)候,下載沒(méi)有問(wèn)題 但是文件大小超過(guò)128K的時(shí)候,就會(huì)出錯(cuò),下載不成功 nConfigDone 不能被拉高 有誰(shuí)知道這是為什么?謝謝…

查看全部問(wèn)答∨

USB轉(zhuǎn)接問(wèn)題

我從網(wǎng)上下載了一個(gè)CP210X驅(qū)動(dòng)程序,安裝上以后,怎么在我的電腦的屬性里面看不到有虛擬出來(lái)的一個(gè)COM端口呢? …

查看全部問(wèn)答∨

關(guān)于調(diào)用Windows XP Tablet PC中的手寫輸入問(wèn)題 請(qǐng)教高手

TabletPC中的手寫輸入路徑為: \\Program Files\\Common Files\\Microsoft Shared\\ink\\TabTip.exe 系統(tǒng)運(yùn)行是, 有一小圖標(biāo)在任務(wù)條上, 只有點(diǎn)小圖標(biāo)才打開(kāi)手寫輸入界面, 在vc中, 如何去讓激活手寫輸入? 如: 當(dāng)程序進(jìn)入某一界面時(shí)自動(dòng)將手寫輸 ...…

查看全部問(wèn)答∨

關(guān)於verilog的for用法

之前看了一個(gè)程式  always@(Bin) beginfor (i=0;i<7;i=i+1)Gry[ i]=Bin[ i]^Bin[i+1];Gry[ i]=Bin[ i];end 由於for迴圈只實(shí)行到他下一行,那在i=7的時(shí)候  他會(huì)自動(dòng)實(shí)行Gry=Bin嗎  我的問(wèn)題是  這一行&nbs ...…

查看全部問(wèn)答∨

元件封裝標(biāo)準(zhǔn)

JEDEC和JEITA這兩個(gè)標(biāo)準(zhǔn)體系中關(guān)于元件封裝有什么區(qū)別么,求指點(diǎn)。。。。…

查看全部問(wèn)答∨

請(qǐng)教STM32讀取內(nèi)部FLASH

大家好,對(duì)于STM32我是一個(gè)新手,要向大家請(qǐng)教。 有個(gè)項(xiàng)目要使用STM32,程序中有些數(shù)據(jù)要放在內(nèi)部的FLASH中,這些數(shù)據(jù)在程序中要進(jìn)行使用。 網(wǎng)上看了些帖子,燒FLASH的例子較多,那該如何取那些存在FLASH中的數(shù)據(jù)呢? 對(duì)這個(gè)應(yīng)用,有使用ST ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 慈溪市| 阳城县| 富阳市| 镇安县| 滕州市| 铜山县| 沙河市| 金沙县| 衡水市| 东乡| 清新县| 扶绥县| 西乡县| 东宁县| 红河县| 虎林市| 遵义市| 木兰县| 凤翔县| 桦甸市| 始兴县| 克拉玛依市| 苗栗县| 贺州市| 弥渡县| 石家庄市| 九江县| 桑日县| 昌平区| 土默特左旗| 雷州市| 焦作市| 增城市| 梁平县| 景洪市| 雷山县| 峨眉山市| 丰台区| 沁水县| 陵水| 高阳县|