在代码审查期间,正在审查此功能:
static inline bool is_aligned(const void *ptr, size_t byte_count)
{
return (uintptr_t) ptr % byte_count == 0;
}
@Toby Speight 说道:
任何类型的对象指针都可以转换为
,但该整数的算术运算未指定。此测试可能在您的平台上有效,但在某些系统(特别是 ia32 分段内存架构)中它可能不正确。uintptr_t
在这种情况下,正确的方法是什么(求余数)?
标准没有说明指向
void
的指针如何转换为 uintptr_t
。
以下类型指定无符号整数类型 任何指向 void 的有效指针都可以转换为此类型的属性, 然后转换回指向 void 的指针,结果将进行比较 等于原来的指针
您假设转换后的
uintptr_t
代表物理地址。这个假设是错误的。编译器在转换期间可以自由地执行任何操作。想象一个将所有指针保留在内部数组中的实现,并且如果该指针在该数组中,uintptr_t
将保存一个索引。