【问题标题】:The posix_memalign() function in c++C++ 中的 posix_memalign() 函数
【发布时间】: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

标签: c++ dynamic-memory-allocation memory-alignment


【解决方案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]——这完全取决于您要做什么以及为什么首先要对齐内存。

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2014-11-12
    • 2015-02-13
    • 2011-08-06
    • 2011-01-21
    相关资源
    最近更新 更多