C++ 中的 posix_memalign() 函数

Posted

技术标签:

【中文标题】C++ 中的 posix_memalign() 函数【英文标题】:The posix_memalign() function in c++ 【发布时间】:2021-12-09 05:59:42 【问题描述】:

我已阅读有关 posix_memalign() 的文档。我仍然不确定如何处理这个The value of alignment shall be a power of two multiple of sizeof(void *). 另外,我需要一些错误消息来检查我的对齐是否成功。

我需要为以下数组分配与 64 字节对齐的内存以及检查错误消息。

int array_dataset [5430][20];
int X_train [4344][20];
int Y_train[4344];
int data_point [20];
int Y-test [1068];
int X_test [1068][20]; 

【问题讨论】:

你考虑过alignas吗? @FrançoisAndrieux 不,我必须使用posix_memalign 【参考方案1】:

posix_memalign 分配对齐的堆内存(类似于 malloc),因此不能与您展示的静态或自动数组一起使用。相反,您的变量需要是用于访问内存的指针

int *Y_train = 0;
if (posix_memalign(&Y_train, 64, 4344*sizeof(*Y_train)) 
    ... there was an error

请注意,对于奇数大小的 2D 数组,这可能是个问题。你可以声明

int (*array_dataset)[20] = 0;
if (posix_memalign(&array_dataset, 64, 5340*sizeof(*array_dataset)) 

但这样做只会对齐第一个子数组——array[0] 将在 64 字节边界上对齐。但是因为 sizeof(int[20]) 不是 64 的倍数(可能是 80,但在某些机器上可能是 40 或 160),array[1] 不会对齐。您可能想使用int (*array_dataset)[32]; 来避免这种情况。或者交换索引并使用int (*array_dataset)[5440]——这完全取决于您要做什么以及为什么首先要对齐内存。

【讨论】:

以上是关于C++ 中的 posix_memalign() 函数的主要内容,如果未能解决你的问题,请参考以下文章

我们啥时候需要使用 posix_memalign 而不是 malloc?

无法在 Visual Studio 2010 中使用函数 posix_memalign

Windows 中 posix_memalign 的正确替代品是啥?

posix_memalign、malloc 和 calloc 与 lli 解释器有问题

如何使用 posix_memalign 动态分配 64B 对齐的 2D 指针数组

ARM GCC 中对 posix_memalign 的未定义引用