内存对齐检查

del*_*unt 16 c visual-studio

我想检查分配的内存是否对齐.我正在使用 _aligned_malloc(size, align);And它返回一个指针.我可以通过简单地将指针内容除以16来检查它吗?如果指针内容可被16整除,是否意味着内存对齐了16个字节?

Gre*_*ill 22

根据定义,"对齐"指针意味着指针的数值可被N整除(其中N是所需的对齐).要检查这一点,将指针转换为适当大小的整数,取模数N,并检查结果是否为零.在代码中:

bool is_aligned(void *p, int N)
{
    return (int)p % N == 0;
}
Run Code Online (Sandbox Code Playgroud)

如果要手动检查指针值,只需查看指针的十六进制表示,看它是否以所需的0位数结束.例如,16字节对齐的指针值总是以四个零位结束.

  • 由于指针对齐问题总是涉及2的幂,因此在单位宽度位之后取位的AND会更快:`return((uintptr_t)p&(uintptr_t)(N - 1))== 0`(这取代了一个冗长的除法指令,最多只有一个减法和一个按位AND.)另外,在C中这些天,指向无符号整数(有符号可能有意想不到的副作用)的指针应该是C99`uintptr_t`(使用`stdint .h`)而不是`int`; (4认同)

nom*_*olo 8

在现代Unix系统上,返回的指针malloc很可能是16字节对齐的,因为SSE之类的东西需要这样做.要检查2的幂的对齐,您可以使用:

((unsigned long)p & (ALIGN - 1)) == 0
Run Code Online (Sandbox Code Playgroud)

这只是一个更快的版本(p % ALIGN) == 0.(如果ALIGN是常量,您的编译器可能会自动使用上面的更快版本.)