PG 中的 MAXALIGN 及对齐分配内存(MemoryContextAllocAligned)

2024-04-08 02:36

本文主要是介绍PG 中的 MAXALIGN 及对齐分配内存(MemoryContextAllocAligned),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在PG源码中,MAXALIGN这个宏,返回最接近输入数字(大于)且能整除8的数,仅此而已。

常用于内存相关的计算,在PG代码中使用的相当广泛,为啥要用这个MAXALIGN?我估计是基于 “CPU访问对齐的地址性能更高” 的认识,PG中各种对象:tuple、page等大小和起始地址都是8字节对齐的,为了8字节对齐,还常常要padding。

有时内存地址的对齐,需要大于MAXALIGN,这时可以用 BUFFERALIGN,它返回最接近输入数字(大于)且能整除32的数。

在新的PG版本中,MemoryContext 提供了可以返回 指定对齐地址 的内存分配函数:

void *MemoryContextAllocAligned(MemoryContext context, Size size, Size alignto, int flags)

它的实现原理也颇为简单,简单地说,就是分配略大于 size + alignto 的一块内存,这样,无论MemoryContextAllocExtended(不支持内存对齐返回)返回的地址是否按照 alignto 对齐,在这块内存中,总能找到按alignto对齐的地址,而且这个对齐地址其后面,可用内存一定大于需要的内存(size)。

有兴趣可以看一下这个函数的代码,对代码粗糙的解释就是下面这张图,当然它还计入了MemoryChunk。

这篇关于PG 中的 MAXALIGN 及对齐分配内存(MemoryContextAllocAligned)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884344

相关文章

自定义结构体的对齐问题

一、跨平台通用数据类型 之前的一篇博客Linux数据类型(通用移植),已经自定义尝试解决了数据通用类型问题。 这里通过源码进行分析,利用源码进行解决问题。在<stdint.h>中我们发现: typedef signed char int8_t;typedef unsigned char uint8_t;typedef short int16_t;typedef unsigned s

SylixOS ARM平台下内存对齐访问

1.内存对齐 1.1     内存对齐概要 现代计算机中内存空间都是按照byte划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 1.2     内存对齐作用和原因 各个硬件平台对存储空间的处理上有很大的不同。一些平

如何在Word中插入表格并进行高级格式化:冒号对齐、添加下划线并分栏

如何在Word中插入表格并进行高级格式化:详细教程 在Word中,表格是一个非常常用的工具,能够帮助我们更好地组织和展示信息。除此之外,本文还将深入探讨如何实现冒号对齐、添加专业的下划线以及隐藏表格线等高级技巧。通过这些技巧,能让你的文档更具美观性与专业性。 第一步:在Word页面上插入表格(大小为6行、2列) 插入表格 打开Word文档,将光标定位到想要插入表格的位置。点击菜单栏中的

CodeWarrior编码时设置大括号{}对齐方式

在利用CodeWarrior写代码时后,每次写了if(),然后写“{}”,“{”会跟在"if()"之后,设置方式如下图:

Word封面对齐技巧

文章目录 前言一、对齐封面1. 点击视图,添加标尺2. 选中文字,右击段落3. 点击制表符,设置制表位位置4. 鼠标点击“:”后面,点击“Tab”键5. 按住“Ctrl”键,选中没对齐的文字,点击“中文板式”,调整宽度6. 最终效果 前言 本章使用的软件是WPS2019,简单介绍Word使用中封面对齐技巧,仅供参考。 一、对齐封面 1. 点击视图,添加

按输入整型数量分配内存

输入任意多的整数,以EOF结束; 目的:使数组分配到的内存刚好为输入整数的总数量+1;其中第一个元素为输入整数的总数量,其后的元素为输入的整数; 如 输入: 1 3 5 4 6 7 输出: 6 1 3 5 4 6 7 有一些关于堆和栈的基础知识: 函数体内声明数组最大为2M左右,而用动态分配则没有这个限制!!! 堆(Heap)栈(Stack)

理解内存对齐

序言  相信大家已经看过不少关于如何计算内存对齐的文章了,但是大家大家有思考过吗,为什么需要内存对齐?为什么要做浪费内存资源的事?直接让数据挨在一起不就行了吗?本篇文章将简单介绍为什么需要内存对齐,以及理解了之后,我们再来看内存对齐。 1. 为什么需要内存对齐  当我们在看一本英语书时,对于熟悉的单词,我们在大脑里面会迅速的反应,并将它翻译为对应的中文含义。但是,当一个单词出现如下情况:

【嵌入式】内存未对齐导致程序崩溃(铺获信号量SIGBUS,数值7)

背景 嵌入式平台上,和A组配合,需要把A组提供的二进制文件在调用A组提供接口时传入,因为有多个bin文件,自测的时候选择了其中一个,运行正常。递交给qa测试了。然后qa反馈必现崩溃。懵了。复现的时候还用的之前的bin文件,无法复现。最后看信号量数值和打印日志判断是在调用接口的地方,然后对了下长度,发现奇数。而自己用的偶数大小的bin文件。然后修改4字节对齐后正常了。 问题现象 日志打印提示:

小tip:中文英文左右padding一致两端对齐实现

by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=4908 不是什么稀奇的技术,很多很多年前自己就玩耍过。 之所以今天拿出来说一下,是因为今天几个小伙伴遇到类似问题,突然发现,一些自己觉得不怎么样的东西,说不定对别人而言会有很大帮助,于是我就打算写篇短文简单介绍

ceph中pg与pool关系

在Ceph中,PG(Placement Group)和Pool是非常重要的概念,它们在Ceph的存储架构中扮演着关键角色。理解这些概念有助于更好地管理和优化Ceph集群。下面详细介绍这两个概念及其相互关系。 Pool(存储池) 定义: Pool(存储池)是Ceph中逻辑上的存储单元,用于组织和管理数据。用户可以通过创建不同的Pool来为不同的应用程序或用途分配存储空间。 类型: Pool可以