我正在制作内存块复制例程,需要以高效 block 的形式处理原始内存块。我的问题不是关于我正在制作的专门复制例程,而是关于如何正确检查 C 中的原始指针对齐。
我有一个内存的原始指针,假设它已经被转换为一个非空的 char *。 在我的架构中,当它与 64 字节 block 对齐时,我可以非常有效地复制 64 字节 block 中的内存。所以(标准)技巧是我将在头部和/或尾部“手动”做一个 0-63 字节的简单副本,以将副本从任意长度的任意 char* 转换为具有多个的 64 字节对齐指针长度为 64 个字节。
现在的问题是,您如何合法地“检查”一个指针以确定(和操纵)它的对齐方式? 显而易见的方法是将其转换为整数并只检查位:
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
请注意,我意识到 alignedPointer 并不指向与指针相同的内存...这是我可以调用我的高效复制例程的“舍入”指针,我将处理任何其他字节手动开始。
但是编译器(理所当然地)在将指针转换为整数时非常害怕。但是在 LEGAL C 中我还能如何检查和操作指针的低位?理想情况下,对于不同的编译器,我不会收到任何错误或警告。
最佳答案
对于大到足以容纳指针的整数类型,C99 stdint.h
有:
-
uintptr_t
intptr_t
数据长度有:
-
size_t
ssize_t
早在 C99 之前就已经存在了。
如果您的平台没有这些,您可以通过仍然使用这些类型名称并为它们制作合适的 typedef
来最大限度地提高代码的可移植性。
关于c - 批准的原始指针操作语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2285287/