c - 批准的原始指针操作语法

标签 c pointers alignment bit-manipulation portability

我正在制作内存块复制例程,需要以高效 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有:

数据长度有:

早在 C99 之前就已经存在了。

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

关于c - 批准的原始指针操作语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2285287/

相关文章:

c - 使用指向 one-past-malloc 的指针是否定义明确?

c - 访问在指向 strtok 的字符数组的指针中传递的变量时获取不正确的值

html - CSS - 多行换行

html - 垂直对齐内联 block div 内的跨度文本

html - 与图像外的左上角对齐的旋转文本?

c - 从 argv[0] 读取

c - 我想知道未使用的字符串是否消耗空间以及为什么程序使用已使用的字符串运行

c - 没有pointee指针不返回null?

c - 如何倒回 proc 文件

c++ - 避免 C++ 类中的内存泄漏