說說記憶體對齊
為什麼要記憶體對齊?因為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...