16

我的问题基本上是关于 C# 编译器如何处理小数据类型的内存分配。我确实知道,例如 add 之类的运算符是在 int 上定义的,而不是在 short 上定义的,因此计算将像 short 是 int 成员一样执行。

假设如下:

  • 没有与选择 short 作为数据类型相关的业务逻辑/验证逻辑
  • 我们不会对不安全的代码做任何事情

尽可能使用短数据类型是否会减少我的应用程序的内存占用,是否建议这样做?或者使用 short 等不值得努力,因为编译器会分配 int32 的全部内存量,并在进行算术运算时添加额外的强制转换。

任何有关假定的运行时性能影响的链接将不胜感激。

相关问题:

为什么我应该在 C# 中使用 int 而不是 byte 或 short

整数求和蓝调,短 += 短问题

4

5 回答 5

11

从仅记忆的角度来看,使用short而不是int会更好。原因很简单,变量只需要 内存中变量short大小的一半。intCLR 不会扩展shortint内存中。

尽管如此,这种减少的内存消耗可能并且可能会显着降低应用程序的运行时性能。所有现代 CPU 在 32 位数字上的性能确实比在 16 位数字下的性能要好得多。此外,在许多情况下,CLR 将不得不在调用带参数的方法之间short进行转换。在采用这种方式之前,您还必须考虑许多其他性能注意事项。intint

我只会在您的应用程序的非常专用的位置和模块上更改此设置,并且只有当您确实遇到可测量的内存短缺时。

在某些情况下,您当然可以轻松地从 切换到intshort而不会影响性能。一个例子是一个巨大的ints 数组,所有这些都适合shorts。

于 2011-06-01T08:43:47.700 回答
1

仅当您的程序中有这些类型的非常大的数组(或基于数组构建的集合List<>如 “大”是指这些数组的总内存占用占工作集很大比例和可用内存的很大比例。至于可取性,我敢冒险使用短类型是不可取的,除非您的程序操作的数据是明确指定的short,或者数据量达到千兆字节。

于 2011-06-01T08:38:18.190 回答
1

简而言之 - 是的。但是,您还应该注意内存对齐。您可能会在 c# 中找到掌握 C# 结构类的内存对齐?有用

于 2011-06-01T08:40:45.937 回答
0

取决于你用短裤做什么。此外,您是否分配了内存占用量很重要的许多变量?

如果这个程序要在移动设备或内存限制的设备上使用,那么我可能会担心。然而,今天的大多数机器都运行至少 1-2 GB 的内存,并拥有相当不错的双核处理器。此外,今天的大多数移动设备正在成为野兽迷你电脑。如果您声明太多以至于那种类型的机器将开始死亡,那么您的代码已经存在问题。

然而,在回答这个问题。如果您在只需要一个 2 字节变量来填充它们时声明大量 4 字节变量,那么在内存有限的机器中可能很重要,那么您应该可能使用 short。

如果您执行复杂的计算、平方根等或高值计算。那么您可能应该使用具有更多字节的变量,这样您就不会冒丢失任何数据的风险。只需在需要时声明您需要什么。如果您完成它以确保 C# 清理它,如果您担心内存限制,请将其归零。

于 2011-06-01T08:39:27.817 回答
0

对于机器语言,在注册表级别,我认为最好与注册表大小保持一致,因为大多数移动和算术函数都是在注册表边界完成的。如果机器设置了 32 位的注册表,最好与 32 位对齐。如果机器有 16 位的 I/O 操作注册表,最好与 16 位对齐以减少移动内容的操作数。

于 2015-09-22T21:19:14.660 回答