gpt4 book ai didi

c - Swift/C 互操作,Swift 中的结构数据更改未在 C 中更新

转载 作者:行者123 更新时间:2023-12-04 15:18:24 25 4
gpt4 key购买 nike

我有一个 C 结构

struct Test {
int a;
}

typedef struct Test Test;

在 C 中我创建了一个指针,

Test* myTestPointer = new Test();

我在 Swift 中获得了结构指针 myTestPointer,并且我检查了该指针确实指向了 Swift 和 C 中的正确地址。

但我很难理解为什么以下两段代码与 C 代码中 a 的值所衡量的不等价?

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 类型) 赋值给变量 x 会导致结构的副本。

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

实际上,结构副本真的经常被优化器完全冲突,但在这种情况下,我认为副本总是会发生,因为指针可以像一个黑匣子一样使用任何方式外部状态观察/突变。

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

关于c - Swift/C 互操作,Swift 中的结构数据更改未在 C 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63883866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com