說說記憶體對齊吧

2021-06-23 07:17:21 字數 1226 閱讀 5185

說說記憶體對齊

為什麼要記憶體對齊?因為cpu為了提高指令提取效率,對資料的存放位址有要求。如果不對齊,會導致效率低下,

甚至錯誤。

如何對齊?既然cpu已經作了規範,剩下的事情就交給編譯器了。對於程式設計師,可以告訴編譯器按照怎麼的方式去

對齊。不同的編譯器指令不一樣:

(1) windows的編譯器cl

#pragma pack(n) //n表示按多少位元組對齊

#pragma pack(show) //顯示當前按多少位元組對齊,編譯時輸出。比如:warning c4810: 雜注 pack(show) 的值 == 8表示按照8位元組對齊

#pragma pack() //表示按照預設位元組對齊

(2) gcc

__attribute((aligned (n))) //n表示按照多少位元組對齊

下面在vs2010,x86平台下測試

一:例子1

//這裡可以看到預設按8位元組對齊

#pragma pack(show) //warning c4810: 雜注 pack(show) 的值 == 8

struct teststruct1

;//1位元組對齊

struct teststruct2

;//4位元組對齊。為什麼呢?因為是取min

int main(int argc, char *argv)

;//1位元組對齊

struct teststruct2

;//這裡結構體最終按2位元組對齊

int main(int argc, char *argv)

;//1位元組對齊

struct teststruct2

;//這裡結構體最終按4位元組對齊

struct teststruct3

;int main(int argc, char *argv)

;//1位元組對齊.大小為4

struct teststruct2

;

struct teststruct3

;int main(int argc, char *argv)

;#pragma pack(pop)  //恢復原來的對齊方式

或者:#pragma pack(n)

struct test ;

#pragma pack() //按照預設的方式對齊

說說struct的對齊

寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?講講位元組對齊吧.分割線 如果體系結構是不對齊的,a中的成員將會乙個挨乙個儲存,從而sizeof a 為11。顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體系結構的...

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

說說canvas吧(一) paint

也就是畫筆,做過自定義元件的都知道,自定義元件中,畫筆是重中之中,掌握好畫筆非常重要 下面我說說畫筆的一些比較實用的操作吧 paint.setcolor color.red 這個方法就不多說了,就是設定畫筆顏色,當然,你要是要自定義顏色可以用mpaint.setcolor color.parseco...