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 解释器有问题