- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想知道下面哪个占用内存多
struct Constants
{
var age = 10
}
或
enum Constants
{
case age = 10
}
我还想知道 enum
和 #define
在内存存储方面的区别。谁能帮帮我?
最佳答案
您的结构将占用 Int 的大小,因此在最近的 Mac 平台上为 64 位(8 字节)。您的枚举通常会占用 UInt8 的大小,即 8 位(1 字节),但在单例枚举的这种特殊情况下,大小为 0 位。
枚举在内部存储一个整数值以匹配案例。
例如这个枚举:
enum Direction {
case east, west, south, north
}
大致相当于:
struct Direction {
private var rawValue: UInt8
private init(_ rawValue: UInt8) {
self.rawValue = rawValue
}
static var east: Direction { Direction(0) }
static var west: Direction { Direction(1) }
static var south: Direction { Direction(2) }
static var north: Direction { Direction(3) }
}
一些自动生成的方法可以在 switch
和 if block 中使用,还有一些编译器魔法来支持 switch 语句的穷尽性。
请注意,rawValue 是 UInt8
,因此任何少于 256 种情况且没有任何关联值的 Swift 枚举都是 8 位(1 字节)。
如果您的枚举超过 255 个案例,rawValue
类型将升级为 UInt16
,依此类推。
包含关联值的枚举会消耗更多内存,其大小是原始值的大小 + 最大关联值的大小。
例如:
enum Shape {
case circle(radius: Double)
case rectangle(width: Double, height: Double)
}
此枚举为 136 位(17 字节):2 * size(Double
) + size(UInt8
) 因为矩形大小写具有最大的关联值,即两个 双
。
在您的例子中,您定义了一个带有 Int
类型的自定义原始值的枚举。与具有关联值的枚举相反,这根本不会改变枚举的大小。编译器只是合成一个返回自定义 rawValue
的计算属性。
例如这个带有 String rawValue
的枚举仍然是 1byte:
enum HelloWorld: String {
case hello = "Hello, "
case world = "world!"
}
// "Equivalent" to...
enum HelloWorld {
case hello
case world
var rawValue: String {
switch self {
case .hello:
return "Hello, "
case .world:
return "world!"
}
}
}
你可以检查任何东西的大小:
MemoryLayout<TypeToSize>.size // for a type
MemoryLayout.size(ofValue: yourValue) /* for an instance */
不过要小心引用类型,例如,类是引用类型,因此它的大小与指针相当,因此在最近的 Mac 平台上为 64 位(8 字节)。
如果您的枚举有很多重关联类型,您可以使用 indirect
关键字将其转换为引用类型,这样它的大小就是一个指针,但这会导致您取消引用操作。
在 Swift 中创建命名空间的正确方法是定义一个没有大小写且只有静态属性的枚举。
枚举相对于结构的优势在于这样的枚举无法实例化,这是命名空间的缩进行为。
在您的情况下,正确的方法是:
enum Constants {
static var age = 10
}
// Example of use...
let birthYear = 2020 - Constants.age
空枚举或只有一种情况的枚举的大小为 0 位。但是,静态属性需要在某个时候存储,这至少要花费 Int
值的大小。
#define
仅存在于 Objective-C AFAIK 中,而不存在于 Swift 中,因此复制此模式的规范方法是通过无大小写枚举(避免全局变量)。
关于ios - 枚举内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35912242/
我是一名优秀的程序员,十分优秀!