1,函数说明
posix_memalign 是一个 POSIX 标准定义的函数,用于在内存中分配对齐的内存块。这个函数可以确保分配的内存块满足特定的对齐要求,通常用于需要对齐内存访问的情况,比如 SIMD 指令集的使用或者特定硬件要求的内存对齐。
下面是 posix_memalign 函数的基本语法:
int posix_memalign(void **memptr, size_t alignment, size_t size);
memptr 是一个指向指针的指针,用于存储分配的内存块的起始地址。
alignment 是所需的内存对齐方式,通常是 2 的幂次方,比如 4、8、16 等。
size 是要分配的内存块的大小(以字节为单位)。
posix_memalign 函数会尝试分配一个大小为 size 字节、按照 alignment 字节对齐的内存块,并将其起始地址存储在 memptr 指向的指针中。如果分配成功,函数返回 0;否则返回一个非零值,表示分配失败。
应用情景:
使用 posix_memalign 函数可以确保分配的内存块满足特定的对齐要求,从而提高内存访问的效率和性能。
2,示例验证
2.1 源码
hello.c :
//int posix_memalign(void **memptr, size_t alignment, size_t size);
//
//
#include <stdio.h>
#include <stdlib.h>
//
#define T (3)
int main()
{
float** p_ptr = NULL;
float** p_ptr_posix = NULL;
p_ptr = (float**) malloc(T*sizeof(float*));
posix_memalign(&p_ptr_posix, 64, T*sizeof(float*));
for(int i=0; i<T; i++){
p_ptr[i] = (float*) malloc(16);
}
for(int j=0; j<T; j++){
posix_memalign(&(p_ptr_posix[j]), 64, 16);
}
for(int k=0; k<T; k++){
printf("%lp\n", p_ptr[k]);
}
printf("\n\n");
for(int s=0; s<T; s++){
printf("%lp\n", p_ptr_posix[s]);
}
return 0;
}
2.2 编译运行
$ gcc hello.c
$ ./a.out
malloc分配内存的地址对齐因素比较复杂,这里的实际效果位32byte 对齐,不做深入分析;
但是 posix_memalign是按照指定的64byte对齐;
实现了对齐目的。