如何检查malloc地址是否与QWord对齐?

时间:2018-07-09 02:54:14

标签: c nvme

我要测试创建NVMe I / O提交队列无效的队列地址偏移量

我使用C posix_memalign分配内存范围

但是如何检查我得到的地址是否与QWord对齐?

我知道我是否希望地址按字对齐,然后地址结尾为00h 并且双字对齐的地址结尾是000h

那么qword对齐的地址结尾是0000h吗?

我可以在下面检查吗?

if( address & 0xF != 0 )
    printf("Not qword aligned");

谢谢

1 个答案:

答案 0 :(得分:3)

一种简单的方法是按位与测试低位。没有实现定义的行为,没有一种完美的便携式方法,但这没关系,因为您的目标是一个特定的体系结构。因此,您可以使用p测试(uintptr_t)(void*)p & 0x0f == 0在16字节边界上,在x86的任何C编译器上是否对齐。

但是,这是一个XY问题:posix_memalign()被定义为执行所需的操作。实际上,保证malloc()返回满足任何类型最严格对齐要求的内存,并且您可以检查alignof(max_align_t)

在这种情况下,您可能需要使用aligned_alloc()(它存在于标准库中)来分配具有更严格的对齐要求的内存,并且具有一个更简单的接口,或者calloc(),它使您可以指定元素大小,然后将内存清零。