#include 裡面定義了如下巨集
#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
主要作用是用於將變數n按照int大小記憶體位址對齊,返回記憶體對齊後n的大小(一般》=sizeof(n))
對於兩個正整數 x, n 總存在整數 q, r 使得因為是用在va_start裡面,棧裡引數的對齊應該是int對齊的,所以要這麼搞x = nq + r, 其中 0<= r
q, r 是唯一確定的。q = [x/n], r = x - n[x/n]. 這個是帶餘除法的乙個簡單形式。在 c 語言中, q, r 容易計算出來: q = x/n, r = x % n.
所謂把 x 按 n 對齊指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 這也相當於把 x 表示為:
x = nq + r', 其中 -n < r' <=0 //最大非正剩餘
nq 是我們所求。關鍵是如何用 c 語言計算它。由於我們能處理標準的帶餘除法,所以可以把這個式子轉換成乙個標準的帶餘除法,然後加以處理:
x+n = qn + (n+r'),其中 0
x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1
所以 qn = [(x+n-1)/n]n. 用 c 語言計算就是:
((x+n-1)/n)*n
若 n 是 2 的方冪, 比如 2^m,則除為右移 m 位,乘為左移 m 位。所以把 x+n-1 的最低 m 個二進位制位清 0就可以了。得到:
(x+n-1) & (~(n-1))
記憶體對齊問題(原創)(看完記得回帖)
class a class b class c cout cout cout 4,1,8 大家一定會奇怪為什麼最後面的那個會是8位元組!這和變數在記憶體中的儲存形式有關 罪魁禍首是編譯器 大家都知道我們所寫的 在編譯後都會變成彙編 也會進一步成為機器 彙編吧資料設計成段棧的儲存形式,為了提高訪問效率...
原創 記憶體指標基位址查詢演算法
首先針對所有有np,gpk等保護引擎,ce貌似都會被乾掉 所以這裡寫一篇關於自動查詢記憶體基位址的偽 演算法,防止忘記。dword begin 0x40000000 用於32位 dword end 0x7fffffff dword offset 0 dword offsetdp 0xff dword...
原創 改進的相對完善的c記憶體池
本程式為記憶體池解決方案 程式設計中兼顧了小記憶體碎片中等內尋管理以及大塊記憶體 設計中參閱了網路的部分記憶體池設計原理,取其精華,本程式池物件分為三個部分,0 initmempool align 4,8,16等等 大小 範圍內的記憶體申請在池鍊錶的同時又乙個池指標索引指向池,比如,設定initme...