枚举类在数组索引时的性能

Enum class performance when array indexing

本文关键字:性能 索引 数组 枚举      更新时间:2023-10-16

我可以期待看到性能的打击在这个…

enum class myEnum {A,B,C};
myArray[(int)myEnum::A] = 123;

与此相比?

enum myEnum {A,B,C};
myArray[A] = 123;

我倾向于为类型安全使用新样式的枚举类,但不想以牺牲性能为代价。

这取决于用作索引的enum值在编译时是已知的还是作为变量传递的。

也就是说,myArray[(int)myEnum::A]不会受到任何惩罚,但myArray[(int)e]可能会受到惩罚,这取决于e的物理表示(即,可能需要"扩展"它)。

另一方面,一个简单的扩展是一个微不足道的操作,不太可能出现性能问题:像分支预测(在条件中)和缓存这样的事情在大多数应用程序中(对于低级应用程序)更重要,在高级应用程序中,算法很重要。

注意:为了避免运行时场景中的扩展问题,您可以将myEnum的基本类型定义为编译器算法所期望的自然类型,我认为ptrdiff_t在这里是最合适的。它是一个大整数

当然,这最终取决于编译器,但很难理解为什么任何合理的编译器会在这两种情况下生成不同的代码。

我在Intel上用g++ 4.7.2测试过,它们编译成相同的汇编代码。

不,类型转换不太可能对性能有任何影响。

我希望不是,但这取决于编译器的实现。你为什么不两种方法都试试,然后计时呢?尝试一些不同的编译器优化设置,这样你就知道,当涉及到生产代码编译时,它不会有什么不同。

我怀疑会有任何用于强制转换的汇编指令,因为整个表达式(int)myEnum::A可以在编译时求值。

但是,如果您真的想知道,可以编写一对示例程序,并通过转储反汇编和/或测量性能来分析它们。