亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        最新c語言結構體中的結構體匯總

        字號:

            在日常學習、工作或生活中,大家總少不了接觸作文或者范文吧,通過文章可以把我們那些零零散散的思想,聚集在一塊。范文怎么寫才能發(fā)揮它最大的作用呢?接下來小編就給大家介紹一下優(yōu)秀的范文該怎么寫,我們一起來看一看吧。
            c語言結構體中的結構體篇一
            q:關于結構體的對齊,到底遵循什么原則?
            a:首先先不討論結構體按多少字節(jié)對齊,先看看只以1字節(jié)對齊的情況:
            #include
            #include
            #define print_d(intvalue) printf(#intvalue" is %dn", (intvalue));#define offset(struct,member) ((char *)&((struct *)0)->member - (char *)0)#pragma pack(1)typedef struct{ char sex; short score; int age;}student;int main(){ print_d(sizeof(student)) print_d(offset(student,sex)) print_d(offset(student,score)) print_d(offset(student,age)) return 0;}
            輸出:
            sizeof(student) is 7offset(student,sex) is 0offset(student,score) is 1offset(student,age) is 3
            可以看到,如果按1字節(jié)對齊,那么結構體內(nèi)部的成員緊密排列,sizeof(char) == 1, sizeof(short) == 2, sizeof(int) == 4.
            修改上面的代碼, 去掉#pragma pack語句,代碼如下:
            #include
            #include
            #define print_d(intvalue) printf(#intvalue" is %dn", (intvalue));#define offset(struct,member) ((char *)&((struct *)0)->member - (char *)0)typedef struct{ char sex; short score; int age;}student;int main(){ print_d(sizeof(student)) print_d(offset(student,sex)) print_d(offset(student,score)) print_d(offset(student,age)) return 0;}
            運行結果:
            sizeof(student) is 8offset(student,sex) is 0offset(student,score) is 2offset(student,age) is 4
            此時,各個成員之間就不像之前那樣緊密排列了,而是有一些縫隙。這里需要介紹下對齊原則:
            此原則是在沒有#pragma pack語句作用時的原則(不同平臺可能會有不同):
            原則a:struct或者union的成員,第一個成員在偏移0的位置,之后的每個成員的起始位置必須是當前成員大小的整數(shù)倍;
            原則b:如果結構體a含有結構體成員b,那么b的起始位置必須是b中最大元素大小整數(shù)倍地址;
            原則c:結構體的總大小,必須是內(nèi)部最大成員的整數(shù)倍;
            依據(jù)上面3個原則,我們來具體分析下: sex在偏移0處,占1字節(jié);score是short類型,占2字節(jié),score必須以2的整數(shù)倍為起始位置,所以它的起始位置為2; age為int類型,大小為4字節(jié),它必須以4的整數(shù)倍為起始位置,因為前面有sex占1字節(jié),填充的1字節(jié)和score占2字節(jié),地址4已經(jīng)是4的整數(shù)倍,所以age的位置為4.最后,總大小為4的倍數(shù),不用繼續(xù)填充。
            繼續(xù)修改上面的代碼,增加#pragma pack語句:
            #include
            #include
            #define print_d(intvalue) printf(#intvalue" is %dn", (intvalue));#define offset(struct, member) ((char *)&((struct *)0)->member - (char *)0)#pragma pack(4)typedef struct{ char sex; short score; int age;}student;int main(){ print_d(sizeof(student)) print_d(offset(student,sex)) print_d(offset(student,score)) print_d(offset(student,age)) return 0;}
            運行結果:
            sizeof(student) is 8offset(student,sex) is 0offset(student,score) is 2offset(student,age) is 4
            具體分析下:
            有了#pragma pack(4)語句后,之前說的原則a和c就不適用了。實際對齊原則是自身對齊值(成員sizeof大小)和指定對齊值(#pragma pack指定的對齊大小)的較小者。依次原則,sex依然偏移為0, 自身對齊值為1,指定對齊值為4,所以實際對齊為1; score成員自身對齊值為2,指定對齊值為4,實際對齊為2;所以前面的sex后面將填充一個1字節(jié),然后是score的位置,它的偏移為2;age自身對齊值為4,指定對齊為4,所以實際對齊值為4;前面的sex和score正好占用4字節(jié),所以age接著存放;它的偏移為4.
            q:關于位域的問題,空域到底表示什么?
            a:它表示之后的位域從新空間開始。
            #include
            #include
            #define print_d(intvalue) printf(#intvalue" is %dn", (intvalue));#define offset(struct, member) ((char *)&((struct *)0)->member - (char *)0)typedef struct { int a : 1; int b : 3; int : 0; int d : 2;}bit_info;int main(){ print_d(sizeof(bit_info)) return 0;}
            運行結果:
            sizeof(bit_info) is 8
            bit_info中的a, b占用4個字節(jié)的前4位,到int:0; 時表示此時將填充余下所有沒有填充的'位,即剛剛的4個字節(jié)的余下28位;int d:2; 將從第四個字節(jié)開始填充,又會占用4個字節(jié),所以總大小為8.
            再來看下面幾個小例子
            例1:
            struct a{ char f1 : 3; char f2 : 4; char f3 : 5; };
            a b c
            a的內(nèi)存布局:111,1111 *,11111 * * *
            位域類型為char,第1個字節(jié)僅能容納下f1和f2,所以f2被壓縮到第1個字節(jié)中,而f3只能從下一個字節(jié)開始。因此sizeof(a)的結果為2。
            例2:
            struct b{ char f1 : 3; short f2 : 4; char f3 : 5; };
            由于相鄰位域類型不同,在vc6中其sizeof為6,在dev-c++中為2。
            例3:
            struct c{ char f1 : 3; char f2; char f3 : 5; };
            非位域字段穿插在其中,不會產(chǎn)生壓縮,在vc6和dev-c++中得到的大小均為3。
            考慮一個問題,為什么要設計內(nèi)存對齊的處理方式呢?如果體系結構是不對齊的,成員將會一個挨一個存儲,顯然對齊更浪費了空間。那么為什么要使用對齊呢?體系結構的對齊和不對齊,是在時間和空間上的一個權衡。對齊節(jié)省了時間。假設一個體系結構的字長為w,那么它同時就假設了在這種體系結構上對寬度為w的數(shù)據(jù)的處理最頻繁也是最重要的。它的設計也是從優(yōu)先提高對w位數(shù)據(jù)操作的效率來考慮的。有興趣的可以google一下,人家就可以跟你解釋的,一大堆的道理。
            最后順便提一點,在設計結構體的時候,一般會尊照一個習慣,就是把占用空間小的類型排在前面,占用空間大的類型排在后面,這樣可以相對節(jié)約一些對齊空間。
            s("content_relate");
            【講解c語言編程中的結構體對齊】相關文章:
            1.
            初步剖析c語言編程中的結構體
            2.
            c語言編程中使用設計模式中的原型模式的講解
            3.
            c語言結構體(struct)常見使用方法
            4.
            c語言結構體(struct)常見使用方法
            5.
            如何學好c語言編程
            6.
            怎么學習c語言編程
            7.
            怎樣學習c++c語言編程
            8.
            c語言高效編程的方法