常见的对齐算法的代码到底是什么意思?

1.

在c语言中,我们经常会看到一个关于内存对齐的宏:

#define ALIGN(x,n) = (((x)+(n)-1)&~((n) - 1) )

或者类似

#define ALIGN(x) = (((x)+3)&~3

第一个宏就是所谓的把 x 按 n 对齐,第二个宏只不过是把n带入具体的数字,我们可以说是把x 按 4 对齐。

宏计算的结果为,把 x 按 n 对齐时,所需要的内存大小

举例:

如果把3 按 4 对齐,那么所需内存的大小为 4,填充为1

如果把5 按 4 对齐,那么所需内存的大小为 8,填充为3

2.

要理解这个宏的具体计算原理,首先我们要知道对任意整数都有如下公式:

b = ac + r; 0<= r < a;

其中所有值都为整数。

随便带入几个数方便有一个直观的认识:若b = 8,c = 2,则 a = 3,r = 2,即 8=3 * 2 + 2;

其中的r,就是我们通常概念中的余数,同时我们可以把它叫做 最小非负剩余。仔细理解这个概念,有助于接下来的推理。

用c 语言或者其他类似语言进行计算时,我们可以得到:

a = b/c; r= b - b/a;

注意:我们讨论的所有的数字都是整数,编程语言通常在计算整数除法时,都遵守一个原则,那就是小数部分全部舍弃,

即8/3 \approx  2.67,编程语言中8/3=2,这里不会四舍五入。

最小非负剩余我们可以来试着写出最大非正剩余,即

x = qn + m; -n< m <=0;

其中r叫做最大非正剩余。

同样,随便带入几个数方便有一个直观的认识:若x = 5,n = 8,则 q = 1,m = -3,即 5=1 * 8 - 3;

推导到这里,我们发现,所谓的最大非正剩余,就是我们要讨论的核心,即把x 按 n 对齐m 的绝对值就是我们把x 按 n 对齐时,要填充的大小,同时我们的宏要求得的既是qn。

现在我们要将最大非正剩余转换成最小非负剩余,这样方便我们求qn

为了达成这个目的,我们做如下推导:

x = qn + m; -n< m <=0;

x + n = qn + m + n; 0 < m <=n;

x + n - 1 = qn + ( m + n - 1); 0=< m <n;

同时观察最大非正剩余公式:

b = ac + r; 0<= r < a;

即:

ac = qn;

b = x + n - 1;

同时在最小非负剩余的讨论中,我们还知道 a = b/c 

可得 qn = ac = b/c*c = (x + n - 1)/n*n;

3.

接下来简单介绍一些推导过程涉及到的位运算,以帮助我们把最后的推导完成。

左移:<<

作用:相当于位运算中的乘法,x 左移 n位,即 x * 2的n次幂

举例:

0011 左移 两位 为1100,即

3 << 2 = 1100 = 3 * 2的2次幂 = 3 * 4 = 12


右移:>>

作用:相当于位运算中的除法,x 右移 n位,即 x / 2的n次幂

举例:

1111 右移 两位 为0011,即

15 >> 2 = 0011 = 15 / 2的2次幂 = 15 / 4 = 3

注意,这里是我们之前讨论的整数除法,并且不会四舍五入

左移右移这两个操作有一个值得注意的地方是,移位后空位补零,也就是说1111(十进制15),右移后再左移,不会变回15,因为右移时被移除的末两位在左移后会被步零

1111 >> 2 = 0011

0011 << 2 = 1100

所以连续的右移再左移,相当于是清理了这个数字的末尾两位。

再看我们求得的公式:qn =  (x + n - 1)/n*n;

内存对齐时,通常对齐数都是2 的某次幂,也就是说我们通常都会按照4 对齐或者8对齐,在这个前提下

我们可以限定n 的范围,即 n 为 2 的某次幂

由此我们又可以得到一个结论,qn =  (x + n - 1)/n*n 相当于将 (x + n - 1) 右移 了几位后,再左移,也就是说将(x + n - 1)末尾几位清零后,得到的结果便是qn

那么是末尾几位呢?答案很明显,是以2为底,n 的对数。

举例来说就是,按 4 对齐时,要将 (x + n - 1) 的末尾 2位清零;按 8 对齐时,要将 (x + n - 1) 的末尾 3位清零。

可以带入具体数字计算一下,比如,把3 按 4 对齐,带入公式得 3 + 4 - 1 = 6,6 得二进制数据为 0110,n = 4,所以末尾2位清零,得 0100 = 4,也就是说,

如果把3 按 4 对齐,那么所需内存的大小为 4,填充为1,结果完全正确。

那么清零操作除了连续的移位操作还有什么其他的操作呢?

我们在宏中看见的 &~ 连续的两个位运算,也能达到同样的效果。

我们可以带入具体数字计算一下,宏为 (((x)+(n)-1)&~((n) - 1) )

我们还是把3 按 4 对齐,宏变为(3 + 3)&~3,其中~3 = ~0011 = 1100,6 = 0110,6&~3 = 0110 & 1100 = 0100 = 4

结果正确。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,203评论 0 6
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,785评论 0 6
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,339评论 0 2
  • Zhōng huá zì jīng 中 华 字 经 dì yī bù fēn 第 一 部分 qián kūn yǒ...
    玉妖凰儿阅读 2,539评论 0 9
  • 上个星期我们视频的时候,妈妈在旁边向我控诉你对她的种种伤害,说着情不自禁的流出了泪。我才意识到,你们的矛盾...
    一条虫的情诗阅读 536评论 7 1