Re: [問題] pointer alignment
看板C_and_CPP (C/C++)作者VictorTom (鬼翼&娃娃魚)時間16年前 (2009/04/04 02:21)推噓3(3推 0噓 8→)留言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
04/04 11:14, 2F
→
04/04 12:11, , 3F
04/04 12:11, 3F
→
04/04 12:11, , 4F
04/04 12:11, 4F
→
04/04 12:12, , 5F
04/04 12:12, 5F
推
04/04 16:11, , 6F
04/04 16:11, 6F
→
04/04 16:11, , 7F
04/04 16:11, 7F
→
04/04 17:01, , 8F
04/04 17:01, 8F
→
04/04 17:02, , 9F
04/04 17:02, 9F
→
04/04 17:02, , 10F
04/04 17:02, 10F
推
04/06 19:37, , 11F
04/06 19:37, 11F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章