【发布时间】:2011-01-18 02:56:12
【问题描述】:
我正在制作一个内存块复制例程,需要以有效的块处理原始内存块。我的问题不是关于我正在制作的专门复制例程,而是关于如何正确检查 C 中的原始指针对齐。
我有一个原始的内存指针,假设它已经被转换为非空字符 *。 在我的架构中,当它与 64 字节块对齐时,我可以非常有效地复制 64 字节块中的内存。所以(标准)技巧是我将在头部和/或尾部“手动”做一个简单的 0-63 字节副本,以将副本从任意长度的任意 char* 转换为具有多个倍数的 64 字节对齐指针长度为 64 字节。
现在的问题是,您如何合法地“检查”指针以确定(和操纵)其对齐方式? 显而易见的方法是将其转换为整数并仅检查位:
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
注意这里我意识到alignedPointer 不指向与指针相同的内存......这是我可以调用我的高效复制例程的“四舍五入”指针,我将处理任何其他字节手动开始。
但是编译器(有理由)在将指针转换为整数时会发疯。但是我还能如何检查和操作 LEGAL C 中指针的低位?理想情况下,使用不同的编译器我不会收到错误或警告。
【问题讨论】:
-
应该没问题,只要
int的大小与您的指针类型相同。 -
啊,但是您假设指针以二进制形式存储从 MSB 到 LSB。我们有什么? 未定义的行为!(就像致命武器的人所说的外交豁免权!)仅仅因为它在现实世界中有效并不能使它变得更少未定义。 ;-)
-
@pennington - 你为什么说字节序是预设的?如果你说“& 0x0f”,0x0F 的含义是明确的。它将由编译器以与指针相同的字节序存储。不会吗?现在,如果您将指针转换为字节数组,那么您确实需要担心。
-
您平台上的系统
memcpy( )真的没有经过调整以利用这一点吗?
标签: c pointers alignment bit-manipulation portability