Swift中ViewController内枚举静态常量的存储位置及地址询问
枚举内静态常量的存储位置解析
先明确核心逻辑:你代码里的Constants.height是枚举类型的静态存储常量,它的存储规则和枚举实例的存储没有直接关联,而是遵循Swift静态常量的通用存储规则。
存储位置
- 因为
height是编译期就能确定值的字面量常量(直接赋值16),它会被存放在数据段的只读区域(.rodata)——这类区域专门存放不可修改的全局/静态常量,避免意外篡改。 - 如果是运行时才能确定值的静态常量(比如依赖运行时计算结果赋值),才会被放到数据段的可读写区域(.data),但你的例子显然属于前者。
内存地址说明
- 它的实际运行时地址是不确定的:现代操作系统普遍启用地址空间布局随机化(ASLR),每次程序启动时数据段的加载基地址都会随机偏移,所以无法提前确定固定地址。
- 你可以通过代码获取相对偏移或运行时地址:
- 打印相对模块基地址的偏移:
print(MemoryLayout.offset(of: \mainViewController.Constants.height)) - 打印运行时实际地址:
print(&mainViewController.Constants.height)
- 打印相对模块基地址的偏移:
额外澄清
你提到的“操作系统将enum存储在栈段”,指的是枚举的实例对象(比如声明一个Constants的case实例作为局部变量时),这类值类型实例通常会分配在栈上。但静态属性属于类型本身的关联数据,和实例的存储位置完全是两个概念。
内容的提问来源于stack exchange,提问作者Suee97
相关产品推荐
相关产品推荐

