让我们说,我有一个名为Foo的Swift结构
struct Foo
{
var a,b,c : Float
var d : Double
init()
{
a = 0
b = 0
c = 0
d = 0
}
}
Swift sizeof(Foo)打印24个字节,4个字节用于Float字段,8个用于Double,4个字节用于arm64。
所以我认为,没有特殊的Swift魔法与结构对齐完成,我们可以自由地将指针传递给内部C函数,以便使用像NEON和Metal这样的东西,只要内置变量是联合,目前无法直接纳入Swift
不知何故,当我尝试使用
获取const void *(Swift中的ConstUnsafePointer<()>)时let a = Foo()
let b = &a
我在第二个表达式
上遇到了令人讨厌的编译器错误'Foo' is not convertible to '@lvalue inout $T1'
我是否遗漏了一些东西,这是通过设计完成的?
Martn R,谢谢你的回答!不过,对我来说,整个情况并不是很清楚。我的目标是创建方便的Math stuff包装器,所以我想实现像乘法一样的@ infix方法并隐藏C后面的所有内部本机东西。例如,对于Matrices,这意味着我们需要从a =中拉出&符号& b *& c表达式,因为如果有办法绕过这个并且在@infix方法实现的范围内从内存中获取原始点,我没有从你的答案和Docs中获得。
像这样:
@infix public func *(l: Mat4, r: Mat4) -> Mat4
{
var m = Mat4()
_internalMat4Multiply(&l, &r, &m)
}
_internalMat4Multiply是void(void *,void *,void *)C方法,进行所有计算
答案 0 :(得分:6)
有两个问题:您无法获取常量的地址(使用let
定义),
并且您只能将变量的地址传递给函数参数。
假设你的C函数是
void myFunc(const void *data);
然后这会起作用:
var a = Foo()
myFunc(&a)
然而,不是在C和Swift中对相同的对齐做出假设,而是 或许应该更好地定义C API中的结构:
struct Foo {
float a;
float b;
float c;
double d;
};
void myFunc(const struct Foo *data);
并使用Swift代码:
var a = Foo(a: 0, b: 0, c: 0, d: 0)
myFunc(&a)