malloc 对比验证 posix_memalign 的功能

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对齐;

实现了对齐目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值