原創 INTSIZEOF 記憶體按照int對齊

2022-04-10 11:45:38 字數 853 閱讀 3830

#include 裡面定義了如下巨集

#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

主要作用是用於將變數n按照int大小記憶體位址對齊,返回記憶體對齊後n的大小(一般》=sizeof(n))

對於兩個正整數 x, n 總存在整數 q, r 使得

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))

因為是用在va_start裡面,棧裡引數的對齊應該是int對齊的,所以要這麼搞

記憶體對齊問題(原創)(看完記得回帖)

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...