Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中,C中(结构、成员)的偏移量是多少?_Swift_Memory_Struct_Offset - Fatal编程技术网

在Swift中,C中(结构、成员)的偏移量是多少?

在Swift中,C中(结构、成员)的偏移量是多少?,swift,memory,struct,offset,Swift,Memory,Struct,Offset,这是Swift中的一个结构: struct A { var x var y var z } 我应该如何获得结构A中y的偏移量,就像C中(A,y)的偏移量一样 谢谢:)您无法可靠地获取y的偏移量,因为Swift还不支持该操作。最终,在“ABI稳定性”实施后,将得到支持 当前推荐的方法是在C中定义结构,并定义C函数以返回字段的偏移量。Swift目前没有为Swift中定义的结构定义标准内存布局。这意味着,通过指针数学来分解结构的任何代码都不能保证在Swift编译器的未来版本上

这是Swift中的一个结构:

struct A {
    var x
    var y
    var z
}
我应该如何获得结构
A
y
的偏移量,就像C中(A,y)的偏移量一样


谢谢:)

您无法可靠地获取
y
的偏移量,因为Swift还不支持该操作。最终,在“ABI稳定性”实施后,将得到支持


当前推荐的方法是在C中定义
结构
,并定义C函数以返回字段的偏移量。

Swift目前没有为Swift中定义的结构定义标准内存布局。这意味着,通过指针数学来分解结构的任何代码都不能保证在Swift编译器的未来版本上工作,甚至不能保证对Swift编译器进行小的更新。(正如@robmayoff所指出的,这是Swift获得稳定ABI的一部分,也是Swift项目今年第5版的目标之一。)

但是,如果您的结构是用C定义并通过桥接头导入的,Swift将尊重其内存的C二进制布局。在这种情况下,该类型提供了C
sizeof
操作符和类似实用程序的等价物。仍然没有等价项的
偏移量,但是您可以通过按C声明顺序添加成员类型的
stride
s来自己计算指针

例如,Apple文档中有一个从交错顶点/法线/纹理坐标数据缓冲区创建3D对象的示例。但它(目前)是用ObjC编写的,使用
sizeof
strideof
告诉SceneKit在哪里可以找到缓冲区中的各种数据。Swift等价物将使用
MemoryLayout.size
代替
sizeof(float)
等,并代替
offsetof(MyVertex,nx)
你需要观察结构中
nx
字段之前有三个float,然后写入
MemoryLayout.stride*3
在Swift 4.2中添加,并实施

例如:

struct A {
    var x: Int8
    var y: Int16
    var z: Int64
}

MemoryLayout.offset(of: \A.x) // 0
MemoryLayout.offset(of: \A.y) // 2
MemoryLayout.offset(of: \A.z) // 8
备注:这应该也可以,但是(从Swift 4.2开始)不编译(错误):

MemoryLayout.offset(of:\.y)
//错误:表达式类型“Int”不明确,没有更多上下文

感谢您的快速回复:)感谢您的精彩回答!实际上,我刚才在OpenGL ES中遇到的问题与您在上一段中描述的非常相似。但代码有些丑陋和僵化:(
MemoryLayout<A>.offset(of: \.y)
// error: Expression type 'Int?' is ambiguous without more context