真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語言之結(jié)構(gòu)體以及結(jié)構(gòu)體對齊訪問

1:簡單理解,結(jié)構(gòu)體就是數(shù)組的進一步發(fā)展,數(shù)據(jù)的優(yōu)點和缺陷在于數(shù)據(jù)里面是元素類型必須相同,但是結(jié)構(gòu)體沒有這個要求,結(jié)構(gòu)體里面元素的類型可以相同也可以不同。

10年積累的網(wǎng)站制作、網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有興賓免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

2:結(jié)構(gòu)體的定義:

struct student
{
    int age;
    char name[20];
}s1;

上面這種方法是結(jié)構(gòu)體定義的同時定義變量,結(jié)構(gòu)體的定義有兩部分組成

struct studen:結(jié)構(gòu)體的類型

s1:類型為struct student的結(jié)構(gòu)體變量,當然還可以用struct studet s2;l來定義變量s2

注意結(jié)構(gòu)體里面的元素不能再創(chuàng)建的時候直接賦值,而是要通過外部訪問來對結(jié)構(gòu)體進行填充

3:結(jié)構(gòu)體里面變量的訪問

    結(jié)構(gòu)體里面的元素訪問方式有兩種,一種是  .    一種是->,但其實質(zhì)上都是通過指針來訪問的。

C語言規(guī)定用結(jié)構(gòu)體的變量來訪問結(jié)構(gòu)體的時候是用  .  用結(jié)構(gòu)體變量的指針來訪問結(jié)構(gòu)體的時候用->

4:結(jié)構(gòu)體的對齊訪問

    首先要知道一點,我們使用 . 的方式來訪問結(jié)構(gòu)體時是不同考慮結(jié)構(gòu)體內(nèi)存對齊問題的,這部分編譯器會幫我們處理,但是如果我們想通過指針方式來訪問結(jié)構(gòu)體里面的各元素的時候就需要考慮內(nèi)存對齊的問題。結(jié)構(gòu)體內(nèi)存對齊訪問一個主要原因是硬件本身的物理限制,使用對齊訪問可以提高訪問的效率。但是內(nèi)存對齊也會帶來內(nèi)存空間浪費的問題,所以內(nèi)存對齊訪問實際上是通過犧牲內(nèi)存空間來換取的速度。

5:結(jié)構(gòu)體對齊的規(guī)則和運算

    編譯器本身可以設(shè)置內(nèi)存對齊的規(guī)則,但是一下幾點規(guī)則需要記住

(1)32位編譯器,一般米、默認是4字節(jié)對齊

(2)結(jié)構(gòu)體整體本身必須安置在4字節(jié)對齊處,也就是結(jié)構(gòu)體的首地址必須是4整數(shù)的倍數(shù)(如果編譯設(shè)置為n字節(jié)對齊訪問,則首地址就是n的整數(shù)倍(n = 1 2 4 8 16 ...))

(3)結(jié)構(gòu)體中每個元素本身必須對齊存放

(4)整個結(jié)構(gòu)體的所占的內(nèi)存空間必須是4的整數(shù)倍(同樣如果是n字節(jié)對齊就是n的整數(shù)倍)

struct mystruct1
{                        //1字節(jié)對齊		//4字節(jié)對齊
int a;           // 4			       //   4
char b;          //1		              //   2
 short c;         //2			     //   2
}mystr1; 

struct mystruct2
{                  //1字節(jié)對齊		  //4字節(jié)對齊
char a;           // 1			  //   4  (1+3)3字節(jié)填充
int    b;          //4		          //   4
 short c;          //2			  //   4  (2 +2)2字節(jié)填充
}mystr2;

分析:

  首先是整個結(jié)構(gòu)體,整個結(jié)構(gòu)體變量4字節(jié)對齊是由編譯器保證的,然后再是第一個元素a,a的開始抵制就是整個結(jié)構(gòu)體的開始地址,所以自然就是4字節(jié)對齊的,但是的結(jié)束地址此時是不確定的,得由下一個元素決定;

第二個元素b,因為上一個元素a本身占4字節(jié),其本身就是對齊的,所以留給b的開始地址也是4字節(jié)對齊,所以b就可直接存放(b存放的開始位置就決定a要占多少個字節(jié),這里因為元素a字節(jié)剛好滿足4字節(jié)對齊,不需要進行填充,所以這里a就占4字節(jié)),b的起始地址決定后,結(jié)束地址的確定需要依賴于下一個元素,原因是可能要進行填充,并且下一個元素的類型不通,則需要填充的字節(jié)數(shù)也是不同的;



新聞名稱:C語言之結(jié)構(gòu)體以及結(jié)構(gòu)體對齊訪問
URL分享:http://weahome.cn/article/ipjigi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部