为什么 Swift 的 malloc/MemoryLayout.size 接受/返回有符号整数?

Why Swift's malloc/MemoryLayout.size take/return signed integers?

提问人:Vitaly 提问时间:6/6/2022 最后编辑:Vitaly 更新时间:6/6/2022 访问量:74

问:

public func malloc(_ __size: Int) -> UnsafeMutableRawPointer!

@frozen public enum MemoryLayout<T> {
    public static func size(ofValue value: T) -> Int
    ...

当在 C / take/return 中哪个是无符号的? 斯威夫特不是在引擎盖下调用 libc 吗?mallocsizeofsize_t

编辑:这是原因吗?https://qr.ae/pvFOQ6他们基本上是想摆脱 C 的遗产?

swift 内存管理 malloc 内存大小 布局

评论


答:

2赞 rob mayoff 6/6/2022 #1

是的,它在后台调用 libc 函数。

Swift 存储库中的 StdlibRationales.rst 文档解释了为什么它导入为:size_tInt

将聚合 API 用作默认整数类型,使用户能够编写更少的显式类型转换。Int

对于 64 位平台,作为签名类型导入不会有问题。唯一关心的是 32 位平台,并且只关注在跨越一半以上地址空间的类似数组的数据结构上运行。即使在 2015 年的今天,仍然有足够多的 32 位平台很有趣,而 64 位 CPU 的 x32 ABI 也很重要。我们同意 32 位平台很重要,但在 32 位平台上 unsigned 的用例非常微不足道,对于仍然需要这样做的代码,总是可以选择对 C 进行位播或使用 C。size_tIntsize_tUInt