使用小数据类型(例如 short 而不是 int)会减少内存使用吗?

Posted

技术标签:

【中文标题】使用小数据类型(例如 short 而不是 int)会减少内存使用吗?【英文标题】:Does using small datatypes (for example short instead of int) reduce memory usage? 【发布时间】:2011-09-06 02:17:12 【问题描述】:

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

假设如下:

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

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

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

相关问题:

Why should I use int instead of a byte or short in C#

Integer summing blues, short += short problem

【问题讨论】:

【参考方案1】:

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

【讨论】:

我认为您的意思是“注册”而不是“注册表”。问题是关于内存使用情况,而不是执行速度。【参考方案2】:

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

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

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

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

【讨论】:

您是否获得了有关运行时性能影响的其他信息?果然使用 short 代替 int 会减少内存占用,但是当它在大多数情况下影响运行时性能时,就不值得了。 @thekip:看看Common Language Infrastructure (CLI) specification。关于如何在 CLI 级别处理 short 有一些详细说明。 感谢您的回复,第 12.1.2 章说 CLI 定义了一个包含 4 字节或 8 字节整数的评估堆栈;但是,它也有一个包含 1 字节和 2 字节整数的内存模型。所以堆栈只包含 4byte 整数(因此是 int32 而不是 int16)?【参考方案3】:

简而言之 - 是的。但是,您还应该注意内存对齐。您可能会发现 Mastering C# structs 和 Memory alignment of classes in c#? 很有用

【讨论】:

【参考方案4】:

取决于您使用短裤的目的。此外,您是否分配了那么多对内存占用很重要的变量?

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

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

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

【讨论】:

【参考方案5】:

仅当您的程序中有这些类型的非常大的数组(或建立在 List<> 等数组上的集合)或由以下组成的压缩结构数组时,才有意义内存使用相同的。 “大”是指这些数组的总内存占用量占工作集的很大比例可用内存的很大比例。至于可取性,我敢说不建议使用短类型,除非您的程序操作的数据明确指定为short 等,或者数据量达到千兆字节。

【讨论】:

以上是关于使用小数据类型(例如 short 而不是 int)会减少内存使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java API 使用 int 而不是 short 或 byte?

为啥编译器将“char”匹配到“int”而不是“short”?

java简单运算-short类型与int类型

C语言数据类型中int与short的区别

在java中,使用byte或short而不是int和float而不是double更有效吗?

Java中short类型想加为啥会成为int型