如何从 UnsafeMutableRawPointer 获取页对齐地址?

How can I get a page-aligned address from an UnsafeMutableRawPointer?

我可能会以错误的方式解决这个问题,因为我过去没有做过太多指针运算(甚至可能没有必要)。

但是,给定 Swift 中的指针(UnsafeMutableRawPointer 类型),我想获得最接近(向下舍入)的页面对齐地址。这是为了使用 msync

同步一些内存映射数据

基本上,我正在尝试迁移一些 Objective C(嗯,基本上是 C)代码,如下所示:

int pageSize = getpagesize();
void *address = [some bytes];
size_t pageIndex = (size_t)address / pageSize;
void *pageAlignedAddress = (void *)(pageIndex * pageSize);

到目前为止 Swift 我有类似的东西:

let pageSize: Int = Int(getpagesize())
let bytes: UnsafeMutableRawPointer = [some bytes]
let pageIndex: Int = Int(bytes) / pageSize
let pageAlignedAddress: UnsafeMutableRawPointer = UnsafeMutableRawPointer(pageIndex * pageSize)

显然,我的 Swift 代码的最后两行无法编译,因为我正在混合类型并使用不存在的初始化程序。但是我看不到如何将我现有的 UnsafeMutableRawPointer 移动为页面对齐,我也看不到任何可能对我有帮助的类型的方法。

也许这对于 Swift 类型来说甚至不是必需的,它们总是页面对齐的…

看来你只需要知道初始化器 IntUnsafeMutableRawPointer 有什么。

Int

init(bitPattern: UnsafeMutableRawPointer?)

UnsafeMutableRawPointer

init?(bitPattern: Int)

Int 有一个初始化器采用 UnsafeMutableRawPointer?,而 UnsafeMutableRawPointer 有一个初始化器采用 Int。你为什么不使用它们?

let pageIndex: Int = Int(bitPattern: bytes) / pageSize
let pageAlignedAddress: UnsafeMutableRawPointer? = UnsafeMutableRawPointer(bitPattern: pageIndex * pageSize)