一種資料結構;
c語言中聚合資料型別的一類;
可以被宣告為變數、陣列、指標等,用以實現比較複雜的資料結構;
是一系列元素的集合,這些元素被稱為結構體成員;
結構體成員需要用結構體名訪問。
struct as1; //s1是結構體變數
一般情況下,宣告出現三個部分的兩個部分即可(標誌或者變數可省略)
結構體可以包含其他結構體,也可以包含指向自己的指標
結構體互相包含時,需要對其中乙個進行不完整宣告
計算結構體大小不是元素單純相加;
32位cpu取四個位元組比乙個位元組更高效方便;
若每個元素首位址都是4的整數倍,取資料元素就能更高效方便;
每個特定平台上編譯器都有自己的預設的對齊係數(對齊模數),可通過編譯命令來改變這一係數;
#pragma pack(n);//n=1,2,4,8,16,其中n就是你想要指定的係數。
一般情況下32位預設4位元組對齊。
1、平台原因(移植原因)
不是所有的硬體平台都能訪問任意位址的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料的,否則丟擲硬體異常。
2、效能原因
資料結構(尤其是棧),應該盡可能在自然邊界上對齊,因為在訪問為對齊的記憶體時,處理器需要訪問兩次,而對齊的記憶體處理器只需要訪問一次。
1.下面的結構體大小分別是多大(假設32位機器)?
struct a
;
//進行整體對齊,最大型別為1《對齊係數4,按1整體對齊,所以1+1+1=3
struct b
;
//進行整體對齊,最大型別為4=對齊係數4,所以按4整體對齊4 1+2=3<4 對齊4 所以4+4=8
struct c
;
//進行整體對齊,最大型別為4=對齊係數4,所以按4整體對齊 1<4(對齊4) 4=4 2<4(對齊4) 所以4+4+4=12
#pragma pack(2)
struct d
;
//進行整體對齊,最大型別為4>對齊係數n(2),所以按2整體對齊 1<2(對齊2)4>2(2的倍數) 2=2 所以2+4+2=8
答案及解析:3 8 12 8
有乙個如下的結構體:
struct a
;
請問在64位編譯器下用sizeof(struct a)計算出的大小是多少?
2428
1618
答案及解析:24
64位編譯器下:指標8位元組(一定不能忘記),題目不說預設4位元組對齊
long a1;
//8short a2;
//2 8+2=10(不是4的倍數)對齊到4的倍數12
int a3;
//4 4+12=16(4的倍數)
int*a4;
//8 8+16=24(4的倍數)
3.在32位cpu上選擇預設對齊的情況下,有如下結構體定義:
struct a
;
則sizeof(struct a)的值為()912
1620
答案及解析16
題目不說,預設4位元組對齊
19+11=30<32bit 4
4+29=33>32bit 4+4
1byte=8bit 1 對齊到 4
4+4+4+4=16
c++中的結構體struct—類
在c++中struct是對於c語言中struct的擴充套件,因為c++是物件導向的語言,可以描述物件的行為,所以在c++中struct內可以放函式,從而就具有類的功能,但又和class有一定的區別。
class和struct的區別
class預設成員是私有的private,struct預設成員是公有的public
class繼承預設是私有的private,struct繼承預設是公有的public
c++中結構體可以不要struct關鍵字,c語言中除了typedef定義別名之外是必須要struct關鍵字。
資料結構的對齊
linux的對齊策略是 2位元組資料型別的位址必須是2的倍數,而較大的資料型別 例如 int,int float,double,long long 的位址必須是4的倍數.windows的對齊策略更加嚴格,認可k位元組基本型別物件的位址都必須是k的倍數.結構體的對齊,除了每個結構體成員對齊以外,還要滿...
結構對齊的原則
結構對齊的原則 未考慮位域 原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 位元組,則要從4的整數倍位址開始儲存 原則2 結構體作為成員 如果乙個結構...
資料結構記憶體邊界對齊的三條原則
struct example1 struct example2 pragma pack 在 原來那篇日誌中,通過寫程式測試發現規律後,便推測上述的strurct example2的結構大小應該是24個位元組,但ygone在vs2008上得到的結果是16個位元組,自己這才寫程式在vc6.0,vs200...