iOS 中两个枚举之间的成本分析



我遇到了一个枚举定义:-

typedef enum NSInteger {
    kBorderTypeNone   = 0,
    kBorderTypeLeft   = 1 << 0,
    kBorderTypeRight  = 1 << 1,
    kBorderTypeTop    = 1 << 2,
    kBorderTypeBottom = 1 << 3
} BorderType;

而且(可能)它可以等同于

typedef enum NSInteger {
    kBorderTypeNone   = 0,
    kBorderTypeLeft   = 1 ,
    kBorderTypeRight  = 2,
    kBorderTypeTop    = 4,
    kBorderTypeBottom = 8
} BorderType;

内部差异是什么(如果有的话)?一个比另一个有什么优势吗?推荐哪一个?

编辑 1:如果两者相同,那么编译器如何处理它?在编译器的哪个阶段,它被简化为同一组指令?

它们是相同的,前一种语法更容易添加更多元素(线性数字增加而不是 2 的幂)。

两种格式编译为相同。从简单的编程角度来看,第一个是有效的。第二个在编译期间更有效,因为它是直接分配值。

没有这样的区别。此枚举用作标志,在这种情况下,您的第一个定义更具可读性。

typedef enum NSInteger {
    kBorderTypeNone   = 0,      // binary 0000
    kBorderTypeLeft   = 1 << 0, // binary 0001
    kBorderTypeRight  = 1 << 1, // binary 0010
    kBorderTypeTop    = 1 << 2, // binary 0100
    kBorderTypeBottom = 1 << 3  // binary 1000
} BorderType;

此外,正如san的回答所表明的那样,econd one在处理过程中更有效率,因为它是价值的直接分配。

最新更新