原 荐 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的倍数的大小。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- echarts dataView数据对齐
- 数据对齐-编辑距离算法详解(Levenshtein distance)
- Golang 内存对齐问题
- 你的内存对齐了吗
- CSS之文本两端对齐
- LWN: kmalloc( )确保对齐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
垃圾回收算法手册:自动内存管理的艺术
Richard Jones、Eliot Moss、Antony Hosking / 王雅光、薛迪 / 机械工业出版社 / 2016-3 / 139
在自动内存管理领域,Richard Jones于1996年出版的《Garbage Collection:Algorithms for Automatic Dynamic Memory Management》可谓是一部里程碑式的作品。接近20年过去了,垃圾回收技术得到了非常大的发展,因此有必要将该领域当前最先进的技术呈现给读者。本书汇集了自动内存管理研究者和开发者们在过去50年间的丰富经验,在本书中......一起来看看 《垃圾回收算法手册:自动内存管理的艺术》 这本书的介绍吧!