uintptr_t 上的算术

问题描述 投票:0回答:1

代码审查期间,正在审查此功能:

static inline bool is_aligned(const void *ptr, size_t byte_count)
{
    return (uintptr_t) ptr % byte_count == 0;
}

@Toby Speight 说道:

任何类型的对象指针都可以转换为

uintptr_t
,但该整数的算术运算未指定。此测试可能在您的平台上有效,但在某些系统(特别是 ia32 分段内存架构)中它可能不正确。

在这种情况下,正确的方法是什么(求余数)?

c
1个回答
0
投票

标准没有说明指向

void
的指针如何转换为
uintptr_t

以下类型指定无符号整数类型 任何指向 void 的有效指针都可以转换为此类型的属性, 然后转换回指向 void 的指针,结果将进行比较 等于原来的指针

您假设转换后的

uintptr_t
代表物理地址。这个假设是错误的。编译器在转换期间可以自由地执行任何操作。想象一个将所有指针保留在内部数组中的实现,并且如果该指针在该数组中,
uintptr_t
将保存一个索引。

© www.soinside.com 2019 - 2024. All rights reserved.