一、結(jié)構(gòu)體
1.1結(jié)構(gòu)體是什么
通俗的說,結(jié)構(gòu)體就是一個類的集合,如同整形數(shù)組是整形數(shù)字的集合體,結(jié)構(gòu)體也是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個成員可以是不同類型的變量。
如果我們要表達一本書,那么這本書的元素有什么呢,書的名字,書的作者,書的創(chuàng)作日期~,而c語言中內(nèi)置的集合不能很好的表達出來,這個時候,就可以使用結(jié)構(gòu)體來定義這本書。
1.2結(jié)構(gòu)體聲明
我們可以在創(chuàng)建結(jié)構(gòu)體時就為他創(chuàng)建變量名
如下:
struct Book
{
char name[10];//自行定義的書的名字
char author[10];//作者
int year;//出版日期
}Mybook;//定義的這個結(jié)構(gòu)體的名字
也可以在主函數(shù)中創(chuàng)建這個變量名:
int main()
{
struct Book Mybook2;
return 0;
}
結(jié)構(gòu)體的變量同時也有著傳值和傳址兩種不同的傳參方式
傳值:
#include<stdio.h>
int main()
{
struct Book Mybook2 = { "book","author","0708" };
printf("%s %s %d", Mybook.name, Mybook2.author, Mybook2.year);
return 0;
}
當使用傳值操作時,訪問這個結(jié)構(gòu)體應(yīng)該用.操作符
傳址:
void print(struct Book* book)
{
printf("%s %s %d", book->name,book->author,book->year);
}
int main()
{
struct Book Mybook2 = { "book","author","0708" };
print(&Mybook2);
return 0;
}
1.3結(jié)構(gòu)體的內(nèi)存
首先得掌握結(jié)構(gòu)體的對齊規(guī)則:
- 第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
- 其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。
對齊數(shù) = 編譯器默認的一個對齊數(shù) 與 該成員大小的較小值。
VS中默認的值為8
Linux中沒有默認對齊數(shù),對齊數(shù)就是成員自身的大小 - 結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。
- 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整
體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
以圖文book為例
計算運行結(jié)果
與我們計算的完全一致。
那么為什么存在內(nèi)存對齊呢
平臺原因(移植原因):
不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特
定類型的數(shù)據(jù),否則拋出硬件異常。
性能原因:
數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。
原因在于,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪
問。文章來源:http://www.zghlxwxcb.cn/news/detail-536212.html
總體來說:
結(jié)構(gòu)體的內(nèi)存對齊是拿空間來換取時間的做法。文章來源地址http://www.zghlxwxcb.cn/news/detail-536212.html
以上便是結(jié)構(gòu)體的介紹,如有不足,請多多指正!
到了這里,關(guān)于【C語言13】結(jié)構(gòu)體的聲明,定義與結(jié)構(gòu)體的內(nèi)存對齊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!