使用默认属性定义枚举,它对性能的影响

时间:2016-08-01 10:51:00

标签: c# performance byte enumeration

枚举的默认值为整数。但是,当我们使用枚举时,我们不会使用这么多的值。所以我的问题是:

enum TYPE : byte{HORIZONTAL , DIAGONAL} //uses 1 byte

enum TYPE {HORIZONTAL , DIAGONAL} // int by default. Uses 4 bytes
    1)3字节空间是否为我们节省了这么多空间?它如何影响当今的计算机?
    2)如果是,为什么它的默认值不是字节?
    3)优秀的程序员应该做些什么?
P。我为不好的英语道歉,这不是我的母语。

2 个答案:

答案 0 :(得分:0)

我从未遇到过使用默认积分类型定义Enums的问题,而您似乎自己也没有问题。如果您在系统中遇到内存问题,则更有可能是由其他问题引起的,而不是为Enums选择int over byte。

这些微小的增强功能在今天便宜的内存计算机中具有罕见的影响。

除非您正在处理内存有限的嵌入式系统,否则请不要专注于那些微优化。

答案 1 :(得分:0)

  

1)3字节空间是否为我们节省了这么多空间?它现在如何影响计算机?

它是否真正节省空间取决于很多其他事情。例如,如果您将枚举用作另一个类中的字段,则可能(或可能不)将内存对齐。我不确定C#中的细节(即使在C ++中这可能是一个复杂的主题) - 也许this SO answer澄清了一些事情。

即使如果确保使用byte枚举总是节省三个字节,请考虑在典型应用程序中使用多少个枚举实例。十?一百?也许一千?我们在这里以千字节的顺序进行讨论,而现代计算机至少有几千兆字节的RAM,这个数字要高出6个数量级。

  

2)如果是,为什么它的默认值不是字节?

这是设计C#的团队做出的决定,我们只能假设他们有自己的理由。

是的,byte只能保存最多255个值。现在可能大多数枚举的值不超过255个,但例如Flags enum只能给出你有8个可能的旗帜,你可能需要更多。此外,由于enum s基本上只是整数,您希望能够对它们执行整数或按位运算(如+|) - 如果你有枚举Flags - 而且无论如何都可以使用完整的32位或64位整数。实际上,对于byte,它们甚至可能较慢,因为该值必须扩展为完整整数然后再次截断。

  

3)优秀的程序员应该做些什么?

像往常一样,除非您正在编写性能或内存关键型应用程序,否则不要担心。特别是在C#中使用其智能编译器,很容易应用实际减慢性能的过早“优化”,所以除非你有非常有说服力的证据证明你实际上需要那些三个额外的字节,只需编写易读性的代码而不是速度。即使如果理论上的3字节差异实际上在实践中存在,你可能会在其他“低效率”中丢失大量的内容,例如填充类,低效的字符串操作,局部变量的副本等等。