我要测试创建NVMe I / O提交队列无效的队列地址偏移量
我使用C posix_memalign分配内存范围
但是如何检查我得到的地址是否与QWord对齐?
我知道我是否希望地址按字对齐,然后地址结尾为00h 并且双字对齐的地址结尾是000h
那么qword对齐的地址结尾是0000h吗?
我可以在下面检查吗?
if( address & 0xF != 0 )
printf("Not qword aligned");
谢谢
答案 0 :(得分:3)
一种简单的方法是按位与测试低位。没有实现定义的行为,没有一种完美的便携式方法,但这没关系,因为您的目标是一个特定的体系结构。因此,您可以使用p
测试(uintptr_t)(void*)p & 0x0f == 0
在16字节边界上,在x86的任何C编译器上是否对齐。
但是,这是一个XY问题:posix_memalign()
被定义为执行所需的操作。实际上,保证malloc()
返回满足任何类型最严格对齐要求的内存,并且您可以检查alignof(max_align_t)
。
在这种情况下,您可能需要使用aligned_alloc()
(它存在于标准库中)来分配具有更严格的对齐要求的内存,并且具有一个更简单的接口,或者calloc()
,它使您可以指定元素大小,然后将内存清零。