[請益] memory aligment
大家好,最近針對對齊部分想進一步了解
在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
--
這是假設malloc得到的起點會亂飄,要用&(~(0xF))修成16 byte
aligned,在修的過程最多只會減15而已0x123F & (~(0xF)) =
0x1230
那請問為何size部分 1024要+15呢
若mem指到0x1231, 而ptr要對齊的位置是0x1240, 多用了15
所以一開始size就多要了15byes, 不然會爆掉 ?
因為你+16可能會浪費16bytes 如同上面兩位舉的例子:
(0x1230+16)&(~ 0xF)=0x1240 但0x1230本身就已符合
Upbound公式是(byte+align-1)/align
Lowerbound公式是byte/align
&~0x0F就是強制對齊16
+16回錯啦
會
你少考慮了原本就是16進位的狀況
*16對齊
簡單來說就是取upbound 的概念 這題就沒問題了
lowerbound可能會導致ptr小於mem
所以一定是取upperbound
是說先別管我最前面兩推的公式,只是感覺那很重要你以
後一定會遇到
如前面m大說的,要確保修正後的ptr,指向的1024B都是自己mal
loc的,就是先多要15,ptr+15後再用&修正(扣掉不align部分)
而且答案其實沒有考慮到最尾巴(多出來尾部使用) 的pa
dding部分
只是我最前面upperbound用除法這題用NAND而已
更正 clear flag
其實答案沒處理結尾padding的處理讓人有點解一半的感覺
是說我最前面兩推的公式是整數除法喔(無條件捨去
阿靠腰我前面的兩個公式忘記還要乘以align
不過概念對就好
重點就是取16的upbound 其他都不用管
可以順便貼原始link嗎?
有點好奇u大的沒處理padding是什麼,function用ptr,free用m
em,應該是沒overflow也沒leak。
不是upperbound是rounddown才對= = C++STL用太多了SORRY
*roundup
to bcew : 這樣會浪費一點點最後的空間
是round-up round-down才對 ==
破英文
to bcew: 不會怎麼樣 但是 那個多出來的空間不會被mark
不會被使用
是不是有寫法讓padding也是16對齊??這個才對吧我想
要不然樓主找的答案會浪費很多空間,那為啥我不要直接分
配 2048就好 爽到爆~
同意?
網路差 打字一職片段
是說我錯了 因為分配完才知道mem的起始位置~
以上都當我放屁
不是有 posix_memalign 可以用?
一串未16-byte aligned 的空間 有可能
頭多1尾多15
頭多2尾多14
...
頭多15尾多1
最壞情況是頭多15尾多1 對吧
所以我無論如何 只要補15讓尾巴變16
開頭位址再 & ~0x0F 就可以了 是吧
對對對你說的都對
就是 round-up而已= =
to u大:要滿足起點對齊16B,總量1024B,使用1039B滿足需求,
不管什麼組合都是前後共15B沒用到,我覺得已經是最小浪費了
,用更小的空間就有某條件不能滿足。
恩恩 不用這摸激動 我只是提出另一個講法 看看能不能幫
助原po
我本來是想說分配的時候就決定結尾突然想到這是OS的事情
很棒GOOD
果然是有誤會^^
原本SO問題的答案很詳細,有另外提到aligned_alloc 可用
大師
感謝大家熱烈的解答~ 高手真多 不然這部分網路上幾乎都是外國的討論
※ 編輯: suscym (114.137.100.199 臺灣), 11/06/2020 08:52:44那實作上 似乎可以先判斷+15前本身是否已是16的倍數 是的
話就可以不用做後面的事 省時間省memory(不用多配15) 這
樣對嗎? 還是其實多了這判斷反而不會比較有效率
你跟我錯一樣的地方欸你要怎麼確認配的mem是16倍數 那
時候malloc都配完了 原子操作(malloc)就是不讓你這樣子
那你無限迴圈malloc free 到mem有16對齊好了 我記得lin
ux是 best fit 只能慢慢等
realloc 的成本和 +15 的成本二選一而已啊
怕
我記得gnu是alloc一定會給alingned過的
我也覺得奇怪
33
[問題] Fallout NV一直記憶體不足最近開始玩Fallout NV,但我到現在差不多每20分鐘就會out of memory 網路上有人說可以裝4GB mod,但我裝了還是一樣 我還有裝Fallout NV Anti Crash一樣沒有用,請問一下該怎麼處理 這問題真的很影響遊戲體驗,另外還有一個小問題是沒辦法調成全螢幕 我的設備是i5-11400 + 16GB Ram + Rtx 3060,沒裝改善畫面mod跑這遊戲應該綽綽有餘才30
[北美] Firmware Embedded 大量面試心得##引言 版上北美科技業文章多為Software的相關職缺跟心得 Firmware Embedded相關文章跟職缺很少 想說來貢獻一下我這半年來面試的心得 拋磚引玉一下 本文也適合一些在台灣IC design,OEM,ODM背景的工程師24
Re: [問卦] 初學Python是不是養成一堆壞習慣?你在講什麼鬼 這個很顯然就是因為先學C導致寫法不pythonic 以你舉的第一個例子來說 應該會是 res = [i % 2 == 0 for i in range(len(list))] 有np的話第一個例子連for in 都省了 import numpy as np res = np.asarray(range(len(list))) % 2 == 03
[請益] 面試程式設計工作筆試到底重不重要?小弟根深蒂固的觀念是寫程式的時候,一舉一動操作都和指標、記憶體、甚至little/big E ndian習習相關,call個function也要有感覺arguments在push,stack memory在深陷,stac k pointer在運動,才不會發生嚴重錯誤; 故程式設計的基礎觀念應在coding 時於血脈中流竄,伴隨鍵盤喀喀的節奏在鼓動,搭配不 停地iteratively檢查操作的正確性來回來回進進出出push pop in in out out;6
Re: Fw: [問卦] C++到底難學在哪裡本來想上班摸魚回的。我C不敢說記得住標準,至少style沒問題,linux kernel也有些提交 meson, cmake都很熟悉。所以編譯不是問題。 C++比如說我要return 一個object,要利用RVO要確認幾件事? 首先object的class要是movable 的,所以你要實現個移動構造。 然後讓經驗很老道的人都要編譯看看asm,要不要寫std.move()3
Re: [討論] 做底層需要刷leetcode 嗎可以去面google firmware engineer呀 考的題目就很底層 像是FIFO_read, FIFO_write, memory debugging, 4 byte-aligement等等實作 有寫過driver的大部分都會接觸到 考link list反轉反而是送分題吧3
[請益] 如何實現單元測試多於整合測試?將單元測試實作於專案時,發現絕大部分API都是針對資料庫做CRUD,這部分程式透過in memory 寫了整合測試,越寫越覺得不對勁,心想單元測試數量不是應該要最多? 網路文 章、影片或實體書籍大多也在探討如何寫單元測試,整合測試資源相對少,在想是不是我 哪裡做錯了,懇請各位大神指教。 --3
Re: [問卦] C++到底難學在哪裡因為螞蟻書比較像字典,不太像解釋程式為什麼要加這個變數,要加這幾行code 而語法的解釋也沒有從設計和需求出發,難以吸收... 然後很多C++書,基本上就是教你怎麼使用這個語言,而不是程式問題怎麼思考+拆解 所以大多也不是給沒學過程設的人讀的... 而我認為比較適合初學者的C++書籍如下:2
[問題] 殺戮尖塔打不開去討論區看也有人同樣反映 能做的都做過了 還是都打不開 開發者也沒打算修 我查討論區 同樣問題去年就出現了==- 晚上收到了 DSL DDR3L 1866 4G, 趕緊裝上去測試 DS218+ 分解前建議先看過前人的 YouTube 免得拆了沒必要的螺絲 安裝後實測結果如下: (使用 dmidecode 指令查詢) 從 type 20 的數據看來, 這兩條 RAM 並沒有跑雙通道