日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言内存字节对齐小结

發布時間:2024/4/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言内存字节对齐小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在C語言面試和考試中經常會遇到內存字節對齊的問題。今天就來對字節對齊的知識進行小結一下。

首先說說為什么要對齊。為了提高效率,計算機從內存中取數據是按照一個固定長度的。以32位機為例,它每次取32個位,也就是4個字節(每字節8個位,計算機基礎知識,別說不知道)。字節對齊有什么好處?以int型數據為例,如果它在內存中存放的位置按4字節對齊,也就是說1個int的數據全部落在計算機一次取數的區間內,那么只需要取一次就可以了。如圖a-1。如果不對齊,很不巧,這個int數據剛好跨越了取數的邊界,這樣就需要取兩次才能把這個int的數據全部取到,這樣效率也就降低了。

?

內存對齊是會浪費一些空間的。但是這種空間上得浪費卻可以減少取數的時間。這是典型的一種以空間換時間的做法。空間與時間孰優孰略這個每個人都有自己的看法,但是C語言既然采取了這種以空間換時間的策略,就必然有它的道理。況且,在存儲器越來越便宜的今天,這一點點的空間上的浪費就不算什么了。

需要說明的是,字節對齊不同的編譯器可能會采用不同的優化策略,以下以GCC為例講解結構體的對齊.

一、原則:

1.結構體內成員按自身按自身長度自對齊。

自身長度,如char=1,short=2,int=4,double=8,。所謂自對齊,指的是該成員的起始位置的內存地址必須是它自身長度的整數倍。如int只能以0,4,8這類的地址開始

2.結構體的總大小為結構體的有效對齊值的整數倍

結構體的有效對齊值的確定:

1)當未明確指定時,以結構體中最長的成員的長度為其有效值

2)當用#pragma pack(n)指定時,以n和結構體中最長的成員的長度中較小者為其值。

3)當用__attribute__ ((__packed__))指定長度時,強制按照此值為結構體的有效對齊值

二、例子

1。

struct AA{

?? ?char a;

?? ?int b;

?? ?char c;?

}aa

結果,sizeof(aa)=12

何解?首先假設結構體內存起始地址為0,那么地址的分布如下

0 ?a

1 ?

2

3

4 ?b

5 ?b

6 ?b

7 ?b

8 ?c

9

10

11

char的字對齊長度為1,所以可以在任何地址開始,但是,int自對齊長度為4,必須以4的倍數地址開始。所以,盡管1-3空著,但b也只能從4開始。再加上c后,整個結構體的總長度為9,結構體的有效對齊值為其中最大的成員即int的長度4,所以,結構體的大小向上擴展到12,即9-11的地址空著。

2.

struct AA{

?? ?char a;

char c;?

?? ?int b;?? ?

}aa

sizeof(aa)=8,為什么呢

0 ?a

1 ?c

2

3

4 ?b

5 ?b

6 ?b

7 ?b

因為c為char類型,字對齊長度為1,所以可以有效的利用1-3間的空格。看見了吧,變量定義的位置的不同時有可能影響結構體的大小的哦!

3.

#pragma pack(2)

struct AA{

?? ?char a;

?? ?int b;

?? ?char c;?

}aa

sizeof(aa)=10,

為什么呢?a到c只占9字節長度,因為結構體的有效對齊長度在pack指定的2和int的4中取

較小的值2。故取2的倍數10。

如果當pack指定為8呢?那就仍然按4來對齊,結果仍然是12。

4.

struct AA{

?? ?char a;

?? ?int b;

?? ?char c;?

}__attribute__((__8__))aa

sizeof(aa)=16,)

為咩?其實a到c仍然只占9字節長度,但結構體以8對齊,故取8的倍數16.

如果其指定2,則結果為10

?

如果pragma pack和__attribute__ 同時指定呢?以__attribute__ 的為準。

需要說明的是,不管pragma pack和__attribute__如何指定,結構體內部成員的自對齊仍然按照其自身的對齊值。

?

另外,不同的編譯器可能會對內存的分布進行優化,

例如有些編譯器會把立體1中的程序優化成例題2的樣子。但這屬于編譯器的問題,

這里不做詳細討論。如果要作為編程的參考的話,最好當做編譯器不會做優化,

盡量在保持代碼清晰的情況下,自己手動將例題1優化成例題2的樣子。

如果是做題的話,按照以上原則做就可以了,不用考慮不同編譯器的特性。

總結

以上是生活随笔為你收集整理的C语言内存字节对齐小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。