原 荐 PostgreSQL中的数据位对齐——MAXALIGN

栏目: 数据库 · PostgreSQL · 发布时间: 6年前

内容简介:最近在看PG的xlog的源代码时,发现了一个这样的宏定义其实理解起来很简单,就是取得这个宏定义,在c.h头文件中

最近在看PG的xlog的源代码时,发现了一个这样的宏定义

#define SizeOfXLogLongPHD   MAXALIGN(sizeof(XLogLongPageHeaderData))

其实理解起来很简单,就是取得 XLogLongPageHeaderData结构体的size,但是对于 MAXALIGN 这个宏还是通过源代码了解了一下,下面对齐进行简单的分析。

这个宏定义,在c.h头文件中

/* Define as the maximum alignment requirement of any C data type. */
#define MAXALIGN(LEN)           TYPEALIGN(MAXIMUM_ALIGNOF  , (LEN))

MAXIMUM_ALIGNOF这个在pg_config.h中定义,熟悉PG源码的都清楚,pg_config.h实在configure执行时自动生成,这个头文件里面的定义基本都和 编译环境和configure时设置的参数相关,这个 MAXIMUM_ALIGNOF也不例外,这个是获得当前编译器中占最大.位的基本类型,比如long long类型。我的机器是ubuntu16.04 的64位版,编译器是gcc5.4,取得的long long类型的大小为8BYTE,所以在这个宏定义当中,MAXIMUM_ALIGNOF=8

下面分析一下TYPEALIGN这个宏定义

/* NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.
  * That case seems extremely unlikely to be needed in practice, however.
  */
#define TYPEALIGN(ALIGNVAL,LEN) (((uintptr_t) (LEN) + ((ALIGNVAL) - 1)) & ~((uintptr_t) ((ALIGNVAL) - 1)))

一步一步的进行理解:(ALIGNVAL在我的机器上为8,那么我们就按照8来进行解析)

提前计算:8的二进制1000;8-1(即(ALIGNVAL) - 1))=7的二进制为0111;最开始的sizeof(XLogLongPageHeaderData)的结构体大小是20.(可自行查看PG的源代码)

(1)了解"与非"运算符(&~),这可以看成两步运算,~的优先级大于&,所以先进行~运算,在进行&运算。

(2)由于(ALIGNVAL) - 1的值为7,所以后面的部分 ~((uintptr_t) ((ALIGNVAL) - 1)) 的值为1000。

(3)前面的部分(((uintptr_t) (LEN) + ((ALIGNVAL) - 1))就是20+7 =27 ,转化为二进制为 0001 10 11。

(4)与第(3)步的计算值进行&运算,得到0001 1000,转换为十进制为24。所以最初的宏SizeOfXLogLongPHD的大小为24。

总结:

通过上面几步,我明白了一下的几点:

(1)为什么需要对 ALIGNVAL 进行减1操作?

答:通过 C语言 的定义我们知道,其实 ALIGNVAL 必定是2的n次幂,因为它代表基本数据类型的size,比如sizeof(char)=2^0;sizeof(int)=2^2。这样转换为二进制必定是1后面接n个0。比如说8=2^3,转换为二进制就是1000,1后面接3个0;16=2^4,转换为二进制就是10000,1后面接4个0。

(2)TYPEALIGN宏定义的意义?

答:通过上面的运算我们能得到,将 ALIGNVAL-1 进行'非'操作,就是将最后的n位转为0,然后与前面的结构体的size进行与操作,最终的目的就是将 sizeof(struct)的大小成为8的倍数。那我们的那个举例:sizeof(XLogLongPageHeaderData)的大小为20,在此基础上加上7就等于27,二进制为11011,然后与1000进行与操作,变为11000,十进制就是24=3*8

其实看到这里我们也就明白了 MAXALIGN 的作用其实就是为了使sizeof( struct )向上对齐,成为8的倍数的大小。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人工智能+:AI与IA如何重塑未来

人工智能+:AI与IA如何重塑未来

[美]韩德尔·琼斯(Handel Jones) [中]张臣雄 / 机械工业出版社 / 2018-10 / 55.00

当深度学习模型引发了全世界对人工智能的再次关注时,人工智能迎来第三次高速增长,人工智能(AI)、增强现实(AR)和虚拟现实(VR)正把人类带向新的“智能增强时代”(IA),我们将在不知不觉中接纳机器智能。 针对人类社会长期存在的众多复杂的动态的难题,人机融合智能将会提供全新的解决方案,谷歌、Facebook、微软、亚马逊、腾讯、阿里巴巴、百度等平台巨头纷纷斥千亿巨资布局人工智能的尖端技术;智......一起来看看 《人工智能+:AI与IA如何重塑未来》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具