作者VictorTom (鬼翼&娃娃魚)
看板C_and_CPP
標題Re: [問題] pointer alignment
時間Sat Apr 4 02:21:13 2009
※ 引述《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)
推 kkdlin:不好意思 再問一下 那這樣去調整指標的位置 04/04 11:14
→ kkdlin:不會有可能去踩到別的已經在heap裡面allocate的區段嗎? 04/04 11:14
→ VictorTom:看一下malloc的size和原本需求的iReqSize的大小的差異, 04/04 12:11
→ VictorTom:稍微算一下或帶幾個數試試, 就知道 ALIGN_SIZE-1 除了當 04/04 12:11
→ VictorTom:& ~()的mask以外, 拿來調整alignment時的另一個用途:) 04/04 12:12
推 kkdlin:大感謝! 豁然開朗! 就是確保他不會往前踩 04/04 16:11
→ kkdlin:整個aligned過後的位址還是在allocate的區域內 04/04 16:11
→ VictorTom:再回應您的原文, 加了ALIGN_SIZE-1才&~()同時也確保了 04/04 17:01
→ VictorTom:align過後的ptr也不會往後踩; 不管您前後始指往大或小 04/04 17:02
→ VictorTom:的位址算過去:) 04/04 17:02
推 freelancer:也可以考慮 posix_memalign 04/06 19:37