Swift 基本知识之十四 Sizeof 和 sizeofValue 解析
来源:互联网 发布:qt高级编程 源码 qt5 编辑:程序博客网 时间:2024/05/16 16:06
喜欢写 C 的读者可能会经常和 sizeof 打交道,不论是分配内存,I/O 操作,还是计算数组大小的时候基本都会用到。这个在 C 中定义的运算符可以作用于类型或者某个实际的变量,并返回其在内存中的尺寸 size_t (这是和平台无关的一个整数类型)。在 Cocoa 中,我们也有一部分 API 需要涉及到类型或者实例的内存尺寸,这时候就可以使用 sizeof 来计算。一个常见的用例是在从一个数组生成 NSData 的时候需要传入数据长度。因为在 Objective-C 中 sizeof 这个 C 运算符被保留了,因此我们可以直接这么做:
char bytes = {1,2,3}; NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)]; NSLog(@"%@",data); //在C语言中sizeof有两个版本,即可以计算类型的长度,又可以接受某个值 int a = sizeof(int); int b = sizeof(bytes); NSLog(@"a==%d,b==%d",a,b);与传统的 C 或者 Objective-C 里的运算符的存在形式不同,在 Swift 中,为了保证类型安全,sizeof 经过了一层包装。在 Swift 中 sizeof 不再是运算符,而是一个只能接受类型的方法。我们还可以找到一个接受具体值,并返回其尺寸的方法:sizeofValue。另外,这样个方法返回的都是看起来比较友好和直接的 Int,而不再是 size_t:func sizeof<T>(_: T.Type) -> Intfunc sizeofValue<T>(_: T) -> Int虽然 sizeofValue 接受的是具体值,但是它和 C 时代的接受具体值的版本的 sizeof 行为并不相同。Swift 的 sizeofValue 所返回的是这个值实际的大小,而并非其内容的大小。具体来说,如果我们在 Swift 中想表示上面的 bytes 的话,我们会将其类型写为 [CChar]。在 C 或者 Objective-C 中,对 bytes 做 sizeof 返回的是整个数组内容在内存中占据的尺寸,每个 char 为 1,而数组元素为 3,因此这个值为 3。而在 Swift 中,我们如果直接对 bytes 做 sizeofValue 操作的话,将返回 8,这其实是在 64 位系统上一个引用的长度:// Cchar bytes[] = {1, 2, 3}; sizeof(bytes); // 3// Swiftvar bytes: [CChar] = [1,2,3] sizeofValue(bytes) // 8所以,我们不能简单地用 sizeofValue 来获取长度,而需要进行一些计算。上面的生成 NSData 的方法在 Swift 中书写的话,等效的代码应该是下面这样的:var bytes: [CChar] = [1,2,3] let data = NSData(bytes: &bytes, length:sizeof(CChar) * bytes.count) 在看一个例子:enum MyEnum: UInt16 { case A = 0 case B = 1 case C = 65535}print("UInt16 =\(sizeof(UInt16))")print("MyEnum = \(sizeof(MyEnum))")print("MyEnum.A = \(sizeofValue(MyEnum.A))")print("MyEnum.A.rawValue=\(sizeofValue(MyEnum.A.rawValue))")结果:
0 0
- Swift 基本知识之十四 Sizeof 和 sizeofValue 解析
- Swift 基本知识之十八 swift格式化输出和反射机制
- [swift学习之十四]计算属性和存储属性
- Swift 基本知识之十二 继承
- Swift 基本知识之十五 swift编码
- sizeof和strlen解析
- 设计模式解析和实现之十四-Command模式
- Swift 基本知识之十三 构造函数
- Swift基本知识
- swift基本知识
- swift语言-变量和常量基本知识
- Swift学习之十四:闭包(Closures)
- Swift学习之十四:闭包(Closures)
- Swift学习之十四:闭包(Closures) .
- Swift学习之十四:闭包(Closures)
- [Swift自学之旅一]Swift的一些基本知识
- 【每日一C之二十四】sizeof结构体探究
- ios深度解析之Swift(结构体和类,属性)
- 深入了解FMDB<三>
- AngularJS 的表单验证(转)
- 基于Android4.2系统的H264视频数据的获取
- js的继承的问题。
- SVN 出错:Attempted to lock an already-locked dir
- Swift 基本知识之十四 Sizeof 和 sizeofValue 解析
- H.264中NAL、Slice与frame意思及相互关系
- 【转载】HttpClient
- 外观模式
- jQuery UI 实例 - 对话框(Dialog)
- 多个数排列形成最大值
- Linux 中的零拷贝技术 二
- 反方向ProgressBar
- DOM元素的各种宽度和高度