[英]Swift / C interop, struct data change in Swift not updating back in C
我有一个 C 结构
struct Test {
int a;
}
typedef struct Test Test;
并在 CI 中创建一个指针,
Test* myTestPointer = new Test();
我在 Swift 中获得了结构指针myTestPointer
,并且我已经检查过该指针确实指向了 Swift 和 C 中的正确地址。
但是我很难理解为什么以下两段代码与 C 代码中a
back 的值不同?
let x = myTestPointer
x!.pointee.a = 123 // correctly changes the memory, as reflected back in C code
var x = myTestPointer!.pointee
x.a = 123 // does not reflect change back in C code
将表达式myTestPointer!.pointee
( Test)
类型Test)
赋值给变量x
会生成结构的副本。
对xa
的更改会影响此副本,但不会影响指针指向的副本。
实际上,结构体副本确实经常被优化器完全冲突,但在这种情况下,我认为副本总是会发生,因为指针可以充当黑盒,可以实现任何方式的外部状态观察/变异。
在任何情况下,您都不应该尝试通过共享状态的突变来来回传达 Swift 和 C 之间(或者坦率地说,任何软件系统的任何两个组件之间)的状态差异。 当然,有时出于性能原因,您需要构建其他通信原语(例如,在进程之间构建消息队列,由底层共享内存区域支持),但总的来说,这种方法是在寻求竞争条件和奇怪的同步困难.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.