public func malloc(_ __size: Int) -> UnsafeMutableRawPointer!
@frozen public enum MemoryLayout<T> {
public static func size(ofValue value: T) -> Int
...
当C中malloc
/sizeof
取/返回无符号的size_t
时?斯威夫特不是在暗地里给libc打电话吗?
是的,它在底层调用libc函数。
Swift repo中的StdlibRationales.rst
文档解释了为什么它将size_t
导入为Int
:
使用
Int
作为默认整数类型的收敛api允许用户编写更少的显式类型转换。对于64位平台,将
size_t
导入为带符号的Int
类型不会有问题。唯一需要考虑的是32位平台,并且只涉及对类似数组的数据结构进行操作,这些数据结构跨越了一半以上的地址空间。即使在2015年的今天,仍然有足够多的32位平台令人感兴趣,64位cpu的x32 abi也很重要。我们同意32位平台很重要,但是在32位平台上使用无符号size_t
的情况相当少,对于需要这样做的代码,总是可以选择对UInt
进行位转换或使用c。