C++使用posix_memalign实现64字节对齐内存分配及错误校验咨询
基于posix_memalign的64字节对齐内存分配实现方案
注意:原数组定义中的
Y-test不符合C语言标识符命名规则(不能包含横杠),实现中统一替换为Y_test。
对齐参数合规性说明
你要求的64字节对齐天然满足posix_memalign的约束要求,无需额外做参数转换:
- 64是2的整数次幂(2^6)
- 无论32位还是64位系统,
sizeof(void*)最大为8字节,64是sizeof(void*)的整数倍,直接传64作为alignment参数即可。
完整实现代码
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <errno.h> #define ALIGN_SIZE 64 int main() { int (*array_dataset)[20] = NULL; int (*X_train)[20] = NULL; int *Y_train = NULL; int *data_point = NULL; int *Y_test = NULL; int (*X_test)[20] = NULL; int ret; // 分配array_dataset: 5430行 每行20个int ret = posix_memalign((void **)&array_dataset, ALIGN_SIZE, 5430 * 20 * sizeof(int)); if (ret != 0) { fprintf(stderr, "分配array_dataset失败: %s\n", strerror(ret)); goto exit_err; } // 校验对齐有效性 if ((uintptr_t)array_dataset % ALIGN_SIZE != 0) { fprintf(stderr, "array_dataset对齐校验失败,实际偏移: %lu字节\n", (uintptr_t)array_dataset % ALIGN_SIZE); goto exit_err; } // 分配X_train: 4344行 每行20个int ret = posix_memalign((void **)&X_train, ALIGN_SIZE, 4344 * 20 * sizeof(int)); if (ret != 0) { fprintf(stderr, "分配X_train失败: %s\n", strerror(ret)); goto exit_err; } if ((uintptr_t)X_train % ALIGN_SIZE != 0) { fprintf(stderr, "X_train对齐校验失败,实际偏移: %lu字节\n", (uintptr_t)X_train % ALIGN_SIZE); goto exit_err; } // 分配Y_train: 4344个int ret = posix_memalign((void **)&Y_train, ALIGN_SIZE, 4344 * sizeof(int)); if (ret != 0) { fprintf(stderr, "分配Y_train失败: %s\n", strerror(ret)); goto exit_err; } if ((uintptr_t)Y_train % ALIGN_SIZE != 0) { fprintf(stderr, "Y_train对齐校验失败,实际偏移: %lu字节\n", (uintptr_t)Y_train % ALIGN_SIZE); goto exit_err; } // 分配data_point: 20个int ret = posix_memalign((void **)&data_point, ALIGN_SIZE, 20 * sizeof(int)); if (ret != 0) { fprintf(stderr, "分配data_point失败: %s\n", strerror(ret)); goto exit_err; } if ((uintptr_t)data_point % ALIGN_SIZE != 0) { fprintf(stderr, "data_point对齐校验失败,实际偏移: %lu字节\n", (uintptr_t)data_point % ALIGN_SIZE); goto exit_err; } // 分配Y_test: 1068个int ret = posix_memalign((void **)&Y_test, ALIGN_SIZE, 1068 * sizeof(int)); if (ret != 0) { fprintf(stderr, "分配Y_test失败: %s\n", strerror(ret)); goto exit_err; } if ((uintptr_t)Y_test % ALIGN_SIZE != 0) { fprintf(stderr, "Y_test对齐校验失败,实际偏移: %lu字节\n", (uintptr_t)Y_test % ALIGN_SIZE); goto exit_err; } // 分配X_test: 1068行 每行20个int ret = posix_memalign((void **)&X_test, ALIGN_SIZE, 1068 * 20 * sizeof(int)); if (ret != 0) { fprintf(stderr, "分配X_test失败: %s\n", strerror(ret)); goto exit_err; } if ((uintptr_t)X_test % ALIGN_SIZE != 0) { fprintf(stderr, "X_test对齐校验失败,实际偏移: %lu字节\n", (uintptr_t)X_test % ALIGN_SIZE); goto exit_err; } // 此处正常执行业务逻辑 printf("所有内存分配且对齐校验通过\n"); exit_err: // 统一释放内存,空指针调用free是安全的 free(X_test); free(Y_test); free(data_point); free(Y_train); free(X_train); free(array_dataset); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }
校验逻辑说明
- 分配阶段直接读取posix_memalign的返回值:返回0代表分配成功,非0代表分配失败,通过strerror可以输出具体错误原因,常见错误包括
EINVAL(对齐参数不符合规范)、ENOMEM(系统内存不足)。 - 额外增加的对齐有效性校验是通过将指针强制转换为
uintptr_t整数类型后对64取模实现,只要模值为0就确认地址是64字节对齐的,避免极端场景下接口异常导致对齐不符合要求。
内容的提问来源于stack exchange,提问作者JOJO
相关产品推荐
相关产品推荐

