Re: [問題] pointer alignment

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/04/04 02:21), 編輯推噓3(308)
留言11則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《kkdlin (kkdlin)》之銘言: : 最近在看driver相關的書籍 真好~~小弟學driver是工作以後碰到一點學一點的Orz : 看到alignment這邊 一直有個問題想不通 : 想請教一下各位 : 書裡面提到一般在將pointer做alignment的時候 : 是用下面的公式 : [pointer + (page_size - 1)] & ~(page_size - 1) : 後面的& 的動作可以理解 就是要把後面的位數清成0 : 變成page size的倍數 : 可是前面的加(page_size - 1)的動作一直想不懂? : 直接將pointer & ~(page_size - 1)不是可以達到一樣的效果嗎? : 想了很久的說..^^" : Thanks in advance 提供一個工作裡常見的例子, 基於某些限制.... 我們有時需要將資料存放的pointer對齊1K, 2K, 4K.... 可是你不能保證malloc回來時pointer一定能對齊這個size.... 所以就有可能有大概的code像下面這幾行.... /////////////////////////////////////////////////////////////////// const int ALIGN_SIZE = 4*1024; // 有時剛好是一個page. int iReqSize; // 先assign data需要的size in byte. byte *ptr_base = malloc( iReqSize + ALIGN_SIZE - 1 ); byte *ptr = (ptr_base + ALIGN_SIZE - 1) & ~(ALIGN_SIZE - 1); /* 在ptr放入iReqSize這麼多bytes的data, 並送往後續處理. */ free(ptr_base); /////////////////////////////////////////////////////////////////// 代價是, 浪費記憶體是在所難免的樣子....Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.174.98 ※ 編輯: VictorTom 來自: 220.132.174.98 (04/04 02:23)

04/04 11:14, , 1F
不好意思 再問一下 那這樣去調整指標的位置
04/04 11:14, 1F

04/04 11:14, , 2F
不會有可能去踩到別的已經在heap裡面allocate的區段嗎?
04/04 11:14, 2F

04/04 12:11, , 3F
看一下malloc的size和原本需求的iReqSize的大小的差異,
04/04 12:11, 3F

04/04 12:11, , 4F
稍微算一下或帶幾個數試試, 就知道 ALIGN_SIZE-1 除了當
04/04 12:11, 4F

04/04 12:12, , 5F
& ~()的mask以外, 拿來調整alignment時的另一個用途:)
04/04 12:12, 5F

04/04 16:11, , 6F
大感謝! 豁然開朗! 就是確保他不會往前踩
04/04 16:11, 6F

04/04 16:11, , 7F
整個aligned過後的位址還是在allocate的區域內
04/04 16:11, 7F

04/04 17:01, , 8F
再回應您的原文, 加了ALIGN_SIZE-1才&~()同時也確保了
04/04 17:01, 8F

04/04 17:02, , 9F
align過後的ptr也不會往後踩; 不管您前後始指往大或小
04/04 17:02, 9F

04/04 17:02, , 10F
的位址算過去:)
04/04 17:02, 10F

04/06 19:37, , 11F
也可以考慮 posix_memalign
04/06 19:37, 11F
文章代碼(AID): #19rbEQ4- (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #19rbEQ4- (C_and_CPP)