内存对齐:
比如一个内存单元的长度为2,为了存取方便我们应该尽量把数据放在2的倍数的位置上(如位置0,2,4,6等),此时称该数据的位置是与某个值(2)对齐的。如果放在了没对齐的地方(比如位置3)上,该数据可能跨过了一次能读取的跨度,就必须读两次才行。
为了杜绝这种低效行为,我们使用一个函数ROUNDUP(n, size)来对原地址n进行修改,从而实现内存对齐。
举个例子,ROUNDUP(9,2)=10,也就是把本来的位置9改成对齐到位置10。
其算法通常是这样的: #define ROUNDUP(x,n) ((x+(n-1))&(~(n-1))),n为对齐的大小
下面对该算法进行一下解释:
我们知道,对于两个正整数 x, n 总存在整数 q, r 使得
x = nq + r, 其中 0<= r <n //最小非负剩余表示法
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'