關於sizeof 的問題

時間 2022-02-13 15:05:03

1樓:匿名使用者

這個涉及到記憶體對齊的問題,一般我們編寫程式的時候不會總考慮記憶體對齊的問題,因為它是由編譯器自動完成的,但要做對這道題還真得仔細考慮這個問題,挺麻煩的,我簡單點給你說。。。

按理說資料在記憶體中儲存應該是按順序的,從第一個位置存到最後一個位置,但事實上並不是這樣,因為這樣做會降低效率,cpu讀取資料是以塊為單位的,所以如果資料是對齊的話,可能一次就讀完了,但如果不是對齊的話,就有可能多讀取一次,這樣效率就低了,所以要對齊。

要計算對齊後的資料所佔空間,首先要明確下面幾個對齊值的區別:

1. 資料型別的自身的對齊值:

這個你可以理解為是這個變數型別所佔的儲存空間,比如在標準c++中,int所佔空間為4,那麼int的自身對齊值就是4了。

2.指定的對齊值:

在編譯的時候,可以向編譯器指定對齊值,如果你不指定,編譯器會使用自己預設的對齊值,比如,我用的c++ builder預設的指定對齊值就是4。

3.結構體或者類的自身對齊值:

是其成員中自身對齊值最大的那個值。

4.資料成員、結構體和類的有效對齊值:

是其自身對齊值和指定對齊值這兩者之中較小的那個值。

在計算的時候必須遵照下面的原則:

第一、假設,資料成員的有效對齊值是n,那儲存這個成員的首地址x,必須滿足x%n=0,如果不等於0,就不能存,必須向後移。

第二、結構體和類的大小,也就是sizeof之後的結果,必須是其內部成員的對齊值的最大值,如果不是,必須補齊。

下面就來計算你這道題了:

i 的型別是 int ,所以他的自身對齊值是4,而指定對齊值是4(也就是系統預設的對齊值),所以 i 的有效對齊值就是4,所以就可以假設 i 是從記憶體中的 0x00000 這個位置開始存了,因為 0x00000%4=0,滿足第一條原則。

而 i 本身佔4個位元組,所以 i 的儲存空間是:0x00000到0x00003

而 j 也是 int 型別,所以 j 的有效對齊值也是4,所以 j 可以從0x00004開始存,因為0x00004%4=0,同樣滿足第一條原則。

所以 j 的儲存空間是:0x00004到0x00007

剩下k了,k的自身對齊值是1,指定對齊值是4,所以有效對齊值是二者較小的那個,是1,所以 k 可以從 0x00008開始存,因為0x00008%1=0。所以 k 的儲存空間是 0x00008。

現在知道了i、j、k的儲存空間是從0x00000到0x00008,佔9個位元組。下面還要進行第二條原則。

整個類x的大小,必須是所有成員對齊值的最大值的整數倍,不足的要補齊。成員最大的對齊值是4,但現在只佔了9個位元組,所以必須補到12,才滿足條件,所以最後sizeof的結果是12了。

打字真辛苦。。。找到了高中寫作文時的感覺。。。

2樓:匿名使用者

class 與 struct 相同,也存在對齊的問題,因為你的class x有3個元素對齊是按照 int 的4個位元組,所以出來是12位元組。

關於送花的問題,關於送花問題

你當然應該送花給她,其實女孩嘴裡說的同心時想的是不一樣的了 愛吃辣椒愛吃醋 還是送比較好,雖然她嘴上這樣說,但你如果真的送了,她一定會很高興的 我覺得還是送的好 我是女生 你送她一定很開心的!雖然她喜歡可是捨不得買啊 如果你送她的話她會覺得你很細心很疼她的 難道送花的事還要 女生開口向你說她想要嗎?...

關於放生的問題,關於放生問題

嗯,是呀,本人也同意回答者 愛齊號 千總 五級,回答者 與花同寂 總監 九級,回答者 嘟嘟 貝貝 秀才 二級,的回答。不過,我就是曾經提倡過不建議放生。因為,我覺得我們學佛的目的是什麼,就是要利益眾生,放生當然就是功德無量的好事。可是,某些學佛的人放生不是為了利益眾生這種單純的目的,而是為了得到最大...

關於鸚鵡的問題,關於鸚鵡問題

好多的問題哦!鸚鵡感冒會死,禽流感嘛!如果是雌雄一對的話他們隨時都會有親暱地舉動,不是一對的話也會有這樣的舉動,甚至把平常的一些啄咬也看成是親暱,您的這一雙鳥是屬於虎皮鸚鵡,但是品種不怎麼好,虎皮花紋消退得太嚴重,區分鳥類的雌雄必須要有一定的經驗,光聽商家的介紹是不一定的。個人認為作為一般剛接觸養鳥...