【问题标题】:C# byte vs int for short integer values [duplicate]C# byte vs int 用于短整数值[重复]
【发布时间】:2017-04-01 14:04:28
【问题描述】:

这个问题与 C# 程序的物理内存有关。正如我们所知,byte 变量消耗 1 个字节的内存,另一方面,int(32 位)变量消耗 4 个字节的内存。那么,当我们需要值可能较小的变量时(例如计数器变量i 来迭代循环 100 次)我们应该在下面的 for 循环中使用哪一个? byteint ?

 for(byte i=0; i<100; ++i)

请理性发表您的意见,并分享您宝贵的知识。我会很高兴并感谢你:-)

注意:在这种情况下,我使用 byte 而不是 int。但是我看到很多有经验的程序员使用int,即使期望值小于255。如果我错了,请告诉我。 :-)

【问题讨论】:

  • 在我看来,每当我进行循环时,我通常不知道数组大小(现在和将来)有多大,因此使用 int 更安全。比如现在数组大小是255,明天可以变成500。所以你需要改代码重新部署。
  • 感谢您的回复... :-)
  • 虽然这个问题已经被问了足够多的时间并且有很多重复,但很少看到像“我们知道,字节变量消耗 1 个字节的内存”这样的说法 - 我建议回来该声明由一些权威来源或至少自己看和衡量。显然,帖子中提供的示例将消耗超过一个字节来为字节变量提供空间(可能至少 4 个字节)。还要确保阅读horses by Eric Lippert 以改善您未来的性能问题。

标签: c# memory int byte


【解决方案1】:

在大多数情况下,使用byte 代替int 不会给您带来任何好处。原因是: 如果循环变量存储在 CPU 寄存器中:由于现代 CPU 的寄存器宽度为 32 位,并且由于您不能只使用寄存器的四分之一,因此生成的代码将几乎相同。

如果循环变量没有存储在 CPU 寄存器中,那么它很可能会存储在堆栈中。编译器会尝试在 4 的倍数的地址上对齐内存位置,这与性能有关,因此编译器还会将 4 个字节分配给堆栈上的字节变量。

根据您代码的详细信息,编译器甚至会添加额外的代码以确保内存位置(在堆栈上或在寄存器中)永远不会超过 255,这会添加额外的代码并使其变慢。 对于像 Atmel 和 Microchip 这样的 8 位微控制器,情况就完全不同了,你的方法会很有意义。

【讨论】:

  • 感谢分享先生 :-) 但是如果字节数据类型消耗的内存与 int.. 那么字节数据类型在 C# 中的用途是什么?实际上我对“我们什么时候应该使用字节数据类型”这一点感到困惑?
  • 旁注:帖子中使用的“现代”定义似乎有点奇怪......我不知道 32 位 CPU 在 2017 年在哪里是“现代”。
  • 字节类型主要用于进行互操作、p/invoke 需要放置确切类型以使其工作的地方,或者在操作流(文件/网络/...)时使用
  • @Alexej Levenkov:那么我们称之为:现代应用程序,因为现在大多数 PC 应用程序都是 32 位的,而不是 64 位的。
  • @HN 学习者:字节类型用于您只需要 8 位存储并且您不想浪费每个变量 3 字节内存空间的情况,例如如果内存中有非常大的数组。如果您有大量此结构的实例,您还可以使用 StructLayoutAttribute 属性来节省结构中的空间。但是对于单个变量,不值得用byte。
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
相关资源
最近更新 更多