Soft_Job 板


LINE

大家好,最近針對對齊部分想進一步了解 在stackoverflow上看到這個問題 The memset_16aligned function requires a 16-byte aligned pointer passed to it, or it will crash. a) How would you allocate 1024 bytes of memory, and align it to a 16 byte boundary? b) Free the memory after the memset_16aligned has executed. Ans: { void *mem = malloc(1024+15); void *ptr = ((uintptr_t)mem+15) & ~ (uintptr_t)0x0F; memset_16aligned(ptr, 0, 1024); free(mem); } ============================== 題目有人講意思講的不精確,應該講塞的下1024B且對移16Byte~ 我這邊想問兩個問題請教 (1) 為何malloc(1024"+15")? 看網站上是說要確定size足夠 但是1024本身不是已經是足夠的嗎? (2) ((uintptr_t)mem+15) & ~ (uintptr_t)0x0F; 這部分我有看到wiki也是這樣列公式,但是自己待一些16進位位置還是感覺不大 我自己第一個想法是mem+16 & ~.... , 雖然也是可行 但大家說15就足夠,這部分是為什麼呢? 以上請大家指教 3Q --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.128.79.74 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1604558246.A.579.html
1F:→ bcew: 這是假設malloc得到的起點會亂飄,要用&(~(0xF))修成16 byte 11/05 15:00
2F:→ bcew: aligned,在修的過程最多只會減15而已0x123F & (~(0xF)) = 11/05 15:00
3F:→ bcew: 0x1230 11/05 15:00
4F:→ suscym: 那請問為何size部分 1024要+15呢 11/05 15:19
5F:推 maik060: 若mem指到0x1231, 而ptr要對齊的位置是0x1240, 多用了15 11/05 15:49
6F:→ maik060: 所以一開始size就多要了15byes, 不然會爆掉 ? 11/05 15:50
7F:推 KaryuuIssen: 因為你+16可能會浪費16bytes 如同上面兩位舉的例子: 11/05 16:13
8F:→ KaryuuIssen: (0x1230+16)&(~ 0xF)=0x1240 但0x1230本身就已符合 11/05 16:14
9F:推 ucrxzero: Upbound公式是(byte+align-1)/align 11/05 18:15
10F:→ ucrxzero: Lowerbound公式是byte/align 11/05 18:17
11F:→ ucrxzero: &~0x0F就是強制對齊16 11/05 18:19
12F:→ ucrxzero: +16回錯啦 11/05 18:19
13F:→ ucrxzero: 會 11/05 18:19
14F:→ ucrxzero: 你少考慮了原本就是16進位的狀況 11/05 18:20
15F:→ ucrxzero: *16對齊 11/05 18:20
16F:推 ucrxzero: 簡單來說就是取upbound 的概念 這題就沒問題了 11/05 18:27
17F:→ ucrxzero: lowerbound可能會導致ptr小於mem 11/05 18:28
18F:→ ucrxzero: 所以一定是取upperbound 11/05 18:28
19F:→ ucrxzero: 是說先別管我最前面兩推的公式,只是感覺那很重要你以 11/05 18:29
20F:→ ucrxzero: 後一定會遇到 11/05 18:29
21F:→ bcew: 如前面m大說的,要確保修正後的ptr,指向的1024B都是自己mal 11/05 18:39
22F:→ bcew: loc的,就是先多要15,ptr+15後再用&修正(扣掉不align部分) 11/05 18:39
23F:推 ucrxzero: 而且答案其實沒有考慮到最尾巴(多出來尾部使用) 的pa 11/05 18:39
24F:→ ucrxzero: dding部分 11/05 18:39
25F:→ ucrxzero: 只是我最前面upperbound用除法這題用NAND而已 11/05 18:40
26F:→ ucrxzero: 更正 clear flag 11/05 18:41
27F:→ ucrxzero: 其實答案沒處理結尾padding的處理讓人有點解一半的感覺 11/05 18:43
28F:→ ucrxzero: 是說我最前面兩推的公式是整數除法喔(無條件捨去 11/05 18:45
29F:推 ucrxzero: 阿靠腰我前面的兩個公式忘記還要乘以align 11/05 18:47
30F:→ ucrxzero: 不過概念對就好 11/05 18:47
31F:推 ucrxzero: 重點就是取16的upbound 其他都不用管 11/05 18:51
32F:推 wulouise: 可以順便貼原始link嗎? 11/05 19:55
https://stackoverflow.com/questions/381244/purpose-of-memory-alignment
33F:→ bcew: 有點好奇u大的沒處理padding是什麼,function用ptr,free用m 11/05 21:34
34F:→ bcew: em,應該是沒overflow也沒leak。 11/05 21:34
35F:推 ucrxzero: 不是upperbound是rounddown才對= = C++STL用太多了SORRY 11/05 22:10
36F:→ ucrxzero: *roundup 11/05 22:10
37F:→ ucrxzero: to bcew : 這樣會浪費一點點最後的空間 11/05 22:11
38F:→ ucrxzero: 是round-up round-down才對 == 11/05 22:11
39F:推 ucrxzero: 破英文 11/05 22:14
40F:推 ucrxzero: to bcew: 不會怎麼樣 但是 那個多出來的空間不會被mark 11/05 22:25
41F:→ ucrxzero: 不會被使用 11/05 22:25
42F:→ ucrxzero: 是不是有寫法讓padding也是16對齊??這個才對吧我想 11/05 22:26
43F:→ ucrxzero: 要不然樓主找的答案會浪費很多空間,那為啥我不要直接分 11/05 22:26
44F:→ ucrxzero: 配 2048就好 爽到爆~ 11/05 22:26
45F:→ ucrxzero: 同意? 11/05 22:26
46F:→ ucrxzero: 網路差 打字一職片段 11/05 22:27
47F:推 ucrxzero: 是說我錯了 因為分配完才知道mem的起始位置~ 11/05 22:59
48F:→ ucrxzero: 以上都當我放屁 11/05 22:59
49F:推 Bencrie: 不是有 posix_memalign 可以用? 11/05 23:00
50F:推 taffy128s: 一串未16-byte aligned 的空間 有可能 11/05 23:04
51F:→ taffy128s: 頭多1尾多15 11/05 23:04
52F:→ taffy128s: 頭多2尾多14 11/05 23:04
53F:→ taffy128s: ... 11/05 23:04
54F:→ taffy128s: 頭多15尾多1 11/05 23:04
55F:→ taffy128s: 最壞情況是頭多15尾多1 對吧 11/05 23:04
56F:→ taffy128s: 所以我無論如何 只要補15讓尾巴變16 11/05 23:04
57F:→ taffy128s: 開頭位址再 & ~0x0F 就可以了 是吧 11/05 23:04
58F:推 ucrxzero: 對對對你說的都對 11/05 23:06
59F:→ ucrxzero: 就是 round-up而已= = 11/05 23:08
60F:→ bcew: to u大:要滿足起點對齊16B,總量1024B,使用1039B滿足需求, 11/05 23:09
61F:→ bcew: 不管什麼組合都是前後共15B沒用到,我覺得已經是最小浪費了 11/05 23:09
62F:→ bcew: ,用更小的空間就有某條件不能滿足。 11/05 23:09
63F:推 taffy128s: 恩恩 不用這摸激動 我只是提出另一個講法 看看能不能幫 11/05 23:11
64F:→ taffy128s: 助原po 11/05 23:11
65F:推 ucrxzero: 我本來是想說分配的時候就決定結尾突然想到這是OS的事情 11/05 23:12
66F:→ ucrxzero: 很棒GOOD 11/05 23:12
67F:→ bcew: 果然是有誤會^^ 11/05 23:14
68F:推 wulouise: 原本SO問題的答案很詳細,有另外提到aligned_alloc 可用 11/05 23:18
69F:推 Apache: 大師 11/06 00:04
感謝大家熱烈的解答~ 高手真多 不然這部分網路上幾乎都是外國的討論 ※ 編輯: suscym (114.137.100.199 臺灣), 11/06/2020 08:52:44
70F:→ suscym: 那實作上 似乎可以先判斷+15前本身是否已是16的倍數 是的 11/06 09:51
71F:→ suscym: 話就可以不用做後面的事 省時間省memory(不用多配15) 這 11/06 09:52
72F:→ suscym: 樣對嗎? 還是其實多了這判斷反而不會比較有效率 11/06 09:52
73F:推 ucrxzero: 你跟我錯一樣的地方欸你要怎麼確認配的mem是16倍數 那 11/06 10:11
74F:→ ucrxzero: 時候malloc都配完了 原子操作(malloc)就是不讓你這樣子 11/06 10:11
75F:推 ucrxzero: 那你無限迴圈malloc free 到mem有16對齊好了 我記得lin 11/06 10:17
76F:→ ucrxzero: ux是 best fit 只能慢慢等 11/06 10:17
77F:推 CoNsTaR: realloc 的成本和 +15 的成本二選一而已啊 11/06 13:21
78F:推 ucrxzero: 怕 11/06 13:36
79F:推 wulouise: 我記得gnu是alloc一定會給alingned過的 11/07 08:47
80F:推 ucrxzero: 我也覺得奇怪 11/07 11:04







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP