0

我想测试创建 NVMe I/O Submission Queue Invalid Queue Address Offset

我使用 C posix_memalign 分配内存范围

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

我知道如果我想要地址是字对齐的,那么地址端是 00h,双字对齐的地址端是 000h

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

我可以通过下面检查吗?

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

谢谢

4

1 回答 1

3

一种简单的方法是使用按位与测试低位。在没有实现定义的行为的情况下,没有一种完全可移植的方法,但这并不重要,因为您的目标是一个特定的架构。因此,您可以p在 x86 的任何 C 编译器上测试在 16 字节边界上对齐,使用(uintptr_t)(void*)p & 0x0f == 0.

然而,这是一个 XY 问题:posix_memalign()被定义为做你想做的事。实际上,malloc()保证返回满足任何类型最严格对齐要求的内存,您可以检查alignof(max_align_t).

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

于 2018-07-09T03:23:01.650 回答