記憶體對齊問題(原創)(看完記得回帖)

2021-05-22 19:57:00 字數 1274 閱讀 6246

class a

class b

class c

cout<

cout<

cout<

4,1,8;

大家一定會奇怪為什麼最後面的那個會是8位元組!

這和變數在記憶體中的儲存形式有關(罪魁禍首是編譯器),大家都知道我們所寫的**,在編譯後都會變成彙編**(也會進一步成為機器**),

彙編吧資料設計成段棧的儲存形式,為了提高訪問效率,它要求每一次移動棧頂指標的步長都要相同(以空間換換時間)!

也就是說即使乙個變數沒有佔那麼多位元組也要把它後面補上一些空位元組來使各變數在記憶體上對齊!而且按照佔位元組最多的那個變數來對齊!

舉個例子吧!

struct s

在記憶體上,儲存這四個變數是按出現的順序來的!首先最長的是b佔8個位元組,前兩個一共佔了5個位元組,所以可以把i和j「連線成一塊",然後在後面補齊3個空位元組,然後寫b8個位元組,最後是a因為後面已經沒有變數了所以他自己在後面補齊4個空位元組!ok !所以結果是24個位元組!

其實這個概念後面還有乙個位域位段的概念,這裡就不提了!

學校還沒開組合語言,我只是憑著自己上學期看的一些棧的知識來理解,希望大家多多批評,幫我找錯誤,多多拍磚,如果看到我的錯誤而不告訴我,

你就是小壞蛋啊!o(∩_∩)o~!

原創 INTSIZEOF 記憶體按照int對齊

include 裡面定義了如下巨集 define intsizeof n sizeof n sizeof int 1 sizeof int 1 主要作用是用於將變數n按照int大小記憶體位址對齊,返回記憶體對齊後n的大小 一般 sizeof n 對於兩個正整數 x,n 總存在整數 q,r 使得 x ...

記憶體對齊問題

一直困惑自己有兩個問題 1.程式為什麼要做記憶體對齊?1.處理器訪問記憶體是粒度為多位元組時,如果資料不是在邊界處,則,處理器需要分多個時鐘週期進行資料的訪問。2.增加可移植性。並非所有的處理器都可以訪問任何位址,可能出現硬體錯誤。具體可以參考 2.struct中如何計算記憶體對齊?先說說c語言中s...

記憶體對齊問題

首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include iostream 45 using namespace std 67 struct st1 8 1314 struct st215 20 21int main 2227 程式的輸出結果為 sizeof st...