[問題] malloc() 計算引數用的複雜運算式原理

看板C_and_CPP作者 (...)時間12年前 (2013/07/25 15:30), 編輯推噓2(2011)
留言13則, 5人參與, 最新討論串1/1
問題(Question): 各位前輩好,我在某個網站上( http://ppt.cc/5WQt )看到了處理二維陣列方法 但是不了解以下程式碼 int pad = (h*sizeof(void*)+15)/16*16 - h*sizeof(void*); 這串的目的是什麼,看他們的討論好像和記憶體align相關,但是看不懂...Orz 如果可以的話煩請前輩們指點迷津 謝謝前輩們的指點 :) 程式碼(Code):(請善用置底文網頁, 記得排版) void* malloc2d( int w, int h, int size ) { int j; int pad = (h*sizeof(void*)+15)/16*16 - h*sizeof(void*); void **a = (void**) malloc( h*sizeof(void*) + pad + w*h*size ); for( j=0; j<h; j++ ) a[j] = ((char *)(a+h)) + pad + j*w*size; return a; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.214.89

07/25 15:40, , 1F
在陣列每一列的尾巴塞進若干byte的pad空間
07/25 15:40, 1F

07/25 15:42, , 2F
使得各列的起始位址剛好相差16的整數倍
07/25 15:42, 2F
謝謝前輩,我瞭解大概的意思了 想再請問為什麼加入 (h*sizeof(void*)+15)/16*16 - h*sizeof(void*)可以剛好相差16的整數倍? h*sizeof(void*) + 15 再除以 16 * 16 ,再減掉 h*sizeof(void*) 這裡不了解...Orz 謝謝前輩指導 :) ※ 編輯: andy2007 來自: 140.114.214.89 (07/25 16:00)

07/25 16:07, , 3F
/16會得到整數,+15再/16就等於無條件進入吧
07/25 16:07, 3F

07/25 16:08, , 4F
阿怎麼都沒看到其他高人 是都在上班喔 X(
07/25 16:08, 4F

07/25 22:20, , 5F
a = (h*sizeof(void*)+15)/16*16 ---> a 必為 16 之倍數
07/25 22:20, 5F

07/25 22:21, , 6F
b = h*sizeof(void*) , a-b ,意思就是為了達到對齊16倍數
07/25 22:21, 6F

07/25 22:22, , 7F
多塞的部份 (像本來需要 30(b) 而已,但對齊變 32(a),a-b=2
07/25 22:22, 7F
謝謝前輩,我又更了解這串程式碼的意思了 想再請問這裡的 "a必為16之倍數" 是怎麼成立的? 我把30(b)代入:( 30 + 15 )/(16*16) 不會等於 32(a) 耶... 是我哪裡用錯了嗎? 謝謝前輩出手相救 :) ※ 編輯: andy2007 來自: 140.114.214.89 (07/26 02:38)

07/26 03:05, , 8F
是((30+15)/16)*16
07/26 03:05, 8F

07/26 03:06, , 9F
/ 是整數除法,整數乘16當然是16的倍數
07/26 03:06, 9F

07/26 08:59, , 10F
括號不要自己亂加 @@
07/26 08:59, 10F

07/26 10:14, , 11F
哈哈哈哈~ 挺有趣的
07/26 10:14, 11F

07/26 10:14, , 12F
括號不要亂加啦
07/26 10:14, 12F

07/26 10:42, , 13F
謝謝大家,我錯了Orz,應該是(30+15)/16 = 2 , 2*16 = 32
07/26 10:42, 13F
文章代碼(AID): #1HyDFvoX (C_and_CPP)