已批准的原始指针操作语法

SPW*_*ley 6 c portability pointers bit-manipulation alignment

我正在制作一个内存块复制例程,需要以高效的块处理原始内存块.我的问题不是关于我正在制作的专门复制例程,而是关于如何正确检查C中的原始指针对齐.

我有一个内存的原始指针,让我们说它已经被转换为非空的char*.在我的架构中,当它与64字节块相对应时,我可以非常高效地以64字节块的形式复制内存.所以(标准)技巧是我将在头部和/或尾部"手动"执行0-63字节的简单复制,以将副本从任意长度的任意字符*转换为具有某些倍数的64字节对齐指针长度为64个字节.

现在的问题是,你如何合法地"检查"一个指针来确定(和操纵)它的对齐?显而易见的方法是将其转换为整数并检查位:

char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
Run Code Online (Sandbox Code Playgroud)

注意这里我意识到alignedPointer并没有指向与指针相同的内存......这是我可以称之为高效复制例程的"向上舍入"指针,我将手动处理任何其他字节.

但是编译器(理所当然地)将指针转换为整数.但是我怎样才能检查和操纵LEGAL C中指针的低位?理想情况下,对于不同的编译器,我不会得到任何错误或警告.

Cra*_*een 7

对于足以容纳指针的整数类型,C99 stdint.h具有:

对于数据长度,有:

在C99之前就已存在.

如果您的平台没有这些,您可以通过仍然使用这些类型名称并typedef为它们制作合适的s 来最大化代码的可移植性.