解析C語言結構體及位段
1.結構的定義
在實際情況中,數(shù)據(jù)經(jīng)常以成組的形式存在。如果這些值的類型各不相同,他們無法同時存儲于同一個數(shù)組中,在C中,可以使用結構把不同類型的值存儲在一起,所以結構也是一些值的集合,這些值稱為它的成員,但是這些成員的類型可以不同。
拓展:
“結構”是一種構造數(shù)據(jù)類型,也叫做用戶自定義數(shù)據(jù)類型,它是由若干“成員”組成的。 每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構造類型。 結構即是一種“構造”而成的數(shù)據(jù)類型, 那么在說明和使用之前必須先定義它,也就是構造它。如同在說明和調用函數(shù)之前要先定義一樣。
2.結構的初始化
結構的初始化和數(shù)組相似,位于一對花括號內,由逗號分隔初始值,可用于結構各個成員的初始化。這些值將根據(jù)結構成員的順序寫出,如果初始值不夠,剩余的結構成員將使用缺省值進行初始化。
struct S
{
int a;
int b[10];
char c[20];
}s={
10,
{1,2,3,4,5},
"abc"
};
typedef:在C中,定義一個結構體類型如果要用typedef:
typedef struct Student
{
int a;
}Stu;
當需要聲明變量時,就可以直接Stu.stu1;如果沒有typedef則需用 struct Student stu1 來聲明;(Stu==struct Student);
4.結構體的內存存儲
結構在內存中的存儲是按照成員列表順序一個接一個的給每個成員分配內存。而在分配的時候則遵循結構體內存對齊規(guī)則:
- (1).第一個成員在與結構體變量偏移量為0的地址處;
- (2).其他成員變量要對齊到對齊數(shù)的整數(shù)倍的地址處; 對齊數(shù):編譯器的默認對齊數(shù)與該成員大小的較小值; (默認對齊數(shù) vs:8,linux:4)
- (3).結構體的總大小為最大對齊數(shù)的整數(shù)倍。
- (4).如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結構體的整體大小就是所有最大對齊數(shù)的整數(shù)倍。
struct S
{
int a;
char b;
double c;
};
//則此結構體大小為16
stuct A
{
doulbe d;
char e;
};
struct S
{
int a;
char b;
struct A C;
double c;
};
//結構體S的大小為32
內存對齊的原因:
- (1).平臺原因:不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù);某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù),否則將拋出硬件異常。
- (2).性能原因:數(shù)據(jù)結構應該盡可能的在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問,而對齊的內存訪問僅需要一次訪問。
5.結構體位段
位段的聲明和結構類似,但位段的成員是一個或多個位的字段。位段成員必須聲明位int,unsigned int或signed int類型。在成員的后面是一個冒號和一個整數(shù),這個整數(shù)就是該位段所占用的位的大小。
struct S
{
int a : 7;
signed int b : 6;
unsigned int c : 12;
};
位段的數(shù)據(jù)存儲:
當一個聲明指定了2個位段,第二個位段無法放在第一個位段剩余的位上,編譯器有可能把第二個位段放在內存的下一個字節(jié)上,也可能直接放在第一個位段后面。
位段的大小:
位段的大小取決于編輯器對位段的數(shù)據(jù)存儲:
struct S
{
int a : 1;
};
//S的大小為4
struct S
{
int a : 1;
int b : 5;
int c : 6;
};
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
C++ 類中有虛函數(shù)(虛函數(shù)表)時 內存分布詳解
下面小編就為大家?guī)硪黄狢++ 類中有虛函數(shù)(虛函數(shù)表)時 內存分布詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C++中常見容器類的使用方法詳解(vector/deque/map/set)
C++中常見的容器類有vector、list、deque、map、set、unordered_map和unordered_set。下面將舉例直接說明各個容器的使用方法,希望對大家有所幫助2023-03-03

