我知道全局变量、静态变量等存储在进程内存区的数据区中. 但是,我知道在 struct 中实现的类型的变量存储在堆栈中.

如果由 struct 实现的变量是全局变量,那么它不能在数据区域中声明吗?

我想知道为什么我可以肯定它是在Stack区域创建的.

推荐答案

struct 存储在堆栈上

这是一种不准确的过度简单化.

struct 直接存储在它们的"父级"中,父级可以是:

  1. 堆分配的对象(class的实例、捕获的闭包上下文等)
  2. 堆栈帧中的局部变量
  3. 或者在全局/静态变量的情况下为Data

它们甚至可能不作为一个整体存储在任何地方,并且它们的构成值只存储在寄存器中,这取决于优化器认为什么是最好的.

这是一篇关于C#的文章(它有GC和JIT),但其余的许多 idea 也适用于Swift:https://ericlippert.com/2010/09/30/the-truth-about-value-types/

在过go ,我通常驳斥这个神话的方式是说,真正的陈述应该是“in the Microsoft implementation of C# on the desktop CLR, value types are stored on the stack when the value is a local variable or temporary that is not a closed-over local variable of a lambda or anonymous method, and the method body is not an iterator block, and the jitter chooses to not enregister the value.”

Swift相关问答推荐

启用完成并发判断以及如何解决警告(续)

SWIFT中MAP的静态方法包装器

有没有一种方法可以迭代可编码的代码(例如,JSON解析中的每一项)?

Swift C外部实现的Task / Future类类型

从后台线程获取@发布属性的值(不更改它)是正确的吗?

是否在字符串属性上搜索数组和子数组?

我可以在预览中通过拖动手势跳转,但在模拟器中失败

SwiftUI同心圆,通过逐渐出现来显示进度

如何增加 NSStatusBar 图像大小?

可以将属性名称传递给 Swift 中的函数吗?

我怎样才能缩短(提高效率)这段代码?

Pod lib lint 命令找不到 watchos 模拟器

RxSwift 事件触发了两次

UIButton 配置不更新按钮标题

签署GoogleSignIn-GoogleSignIn需要开发团队

如何在 SwiftUI 中通过按钮点击一次为一个更改设置动画?

使用 Swift 以编程方式自定义 UITableViewCell

TabView 在切换选项卡时重置导航堆栈

快速延迟加载属性

通过单击表格视图中的单元格打开新的视图控制器 - Swift iOS