繁体   English   中英

Swift / C 互操作,Swift 中的结构数据更改不会更新回 C

[英]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!.pointeeTest)类型Test)赋值给变量x会生成结构的副本。

xa的更改会影响此副本,但不会影响指针指向的副本。

实际上,结构体副本确实经常被优化器完全冲突,但在这种情况下,我认为副本总是会发生,因为指针可以充当黑盒,可以实现任何方式的外部状态观察/变异。

在任何情况下,您都不应该尝试通过共享状态的突变来来回传达 Swift 和 C 之间(或者坦率地说,任何软件系统的任何两个组件之间)的状态差异。 当然,有时出于性能原因,您需要构建其他通信原语(例如,在进程之间构建消息队列,由底层共享内存区域支持),但总的来说,这种方法是在寻求竞争条件和奇怪的同步困难.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM