内存对齐检查

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

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

 bool is_aligned(void *p, int N) { return (int)p % N == 0; } 

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

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

 ((unsigned long)p & (ALIGN - 1)) == 0 

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

malloc返回的内存与所有内容对齐(即,它通常使用适用于所有内容的对齐方式)*。 这意味着,如果您有对齐问题,那么它就是其他问题。

http://www.delorie.com/gnu/docs/glibc/libc_31.html

http://msdn.microsoft.com/en-us/library/ms859665.aspx

(更高的对齐顺序似乎有例外,无论如何这是一个不寻常的要求。)