zoukankan      html  css  js  c++  java
  • Swift-05-SizeOf&&SizeOfValue

      在C中定义的运算符,可以作用于类型或者某个实际的变量,并返回其在内存中的尺寸size_t.

      在Cocoa中,我们一般用来将数组生成NSData的时候传入数据长度。因为在OC里面,sizeOf这个C运算符被保留了。

    char bytes[] = {1, 2, 3};  
    NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)]; 
    

      C中的sizeOf有两个版本,既可以接受类型,也可以接受某个具体的值。

      sizeOf(int)

      sizeOf(a)

      在Swift中,为了保证类型安全,sizeOf经过了一层包装,它不再是运算符,而是一个只能接受类型的方法。

      我们还可以找到一个接受具体值,并返回尺寸的方法:sizeOfValue.这个方法返回的是Int,不是size_t。

    var bytes:[CChar] = [1,2,3]
    sizeofValue(bytes)
    print(sizeofValue(bytes))----》8
    

      虽然SizeofValue接受的是具体是,但是它和C的接收具体值的版本的sizeof行为并不相同。sizeofValue所返回的是这个值实际的大小,而并非其内容的大小。

      如果我们在Swift中想表示上面的bytes的话,我们会将其类型写为CChar。在C或者OC中,对bytes做sizeof返回的是整个数组内容在内存中占据的尺寸。每个char为1,而数组元素为3,因此这个值是3.在Swift中,我们如果直接对bytes做sizeofValue操作的话,将返回8。

    var bytes32:[CChar] = [1,2,3]
    print(sizeofValue(bytes32))
    

      

    var bytes44:[CChar] = [1,2,3]
    let data = NSData(bytes: &bytes44, length: sizeof(CChar) * bytes44.count)
    print(data)
    

      

    print(sizeof(UInt16))
    print(sizeof(MyEnum))
    print(sizeofValue(MyEnum.A))
    print(sizeofValue(MyEnum.A.rawValue))
    
    2
    1
    1
    2
    

      没有咋看懂。

  • 相关阅读:
    Tornado @tornado.gen.coroutine 与 yield
    ThreadPoolExecutor执行任务,异常日志缺失问题
    Mybatis关联查询<association> 和 <collection>
    Spring整合mybatis
    Jedis操作Redis--Key操作
    Jedis操作Redis--SortedSet类型
    Jedis操作Redis--Set类型
    同义词 “stop from”,“keep from”和“prevent from”的区别
    test
    Python win32gui调用窗口到最前面
  • 原文地址:https://www.cnblogs.com/tanglimei/p/5132638.html
Copyright © 2011-2022 走看看