我的问题基本上是关于C#编译器如何处理小数据类型的内存分配。我知道例如像add这样的运算符是在int上定义而不是在short上定义的,因此计算将被执行,好像short是int成员一样。
假设如下:
尽可能使用短数据类型会减少应用程序的内存占用量,是否建议这样做?或者使用short等不值得努力,因为编译器例如分配int32的完整内存ammount并在进行算术时添加额外的强制转换。
非常感谢任何关于假定的运行时性能影响的链接。
相关问题:
答案 0 :(得分:9)
从仅限内存的角度来看,使用short
代替int
会更好。原因很简单,short
变量只需要内存中int
变量的一半大小。 CLR不会在内存中将short
扩展为int
。
然而,这种减少的内存消耗可能并且可能会显着降低应用程序的运行时性能。所有现代CPU的32位数字比16位数字表现更好。此外,在许多情况下,CLR必须在short
和int
之间进行转换。调用带有int
个参数的方法。在采用这种方式之前,您还需要考虑许多其他性能因素。
我只会在应用程序的非常专用的位置和模块中进行更改,并且只有在您确实遇到可测量的内存不足时才会更改。
在某些情况下,您可以轻松地从int
切换到short
,而不会影响性能。一个例子是int
的巨大数组,所有这些数组也适合short
。
答案 1 :(得分:1)
只有在程序中包含这些类型的非常大的数组(或构建在List<>
等数组上的集合)或打包结构数组时,在内存使用方面才有意义由相同的组成。 “大”意味着这些阵列的总内存占用量占工作集和的很大一部分可用内存。至于可行性,我冒昧地建议不要使用短类型,除非你的程序操作的数据是用short
等明确指定的,或者数据量达到千兆字节。
答案 2 :(得分:1)
总之 - 是的。但是,您还应该注意内存对齐。您可能会发现Mastering C# structs和Memory alignment of classes in c#?有用
答案 3 :(得分:0)
取决于您使用短裤的原因。另外,您是否分配了许多内存占用重要的变量?
如果该程序将用于移动设备或具有内存限制的设备,那么我可能会担心。但是,目前大多数机器至少运行1-2 GB的RAM,并且具有相当不错的双核处理器。此外,如今大多数移动设备正在成为野兽迷你电脑。如果您声明这种类型的机器会开始死亡,那么您的代码中就会出现问题。
然而,在回答这个问题时。如果你只需要一个2字节的变量填充它们就可以在内存有限的机器中声明很多4字节变量,那么你应该使用短路。
如果您执行复杂的计算,平方根等,或高值计算。那么你应该使用更多字节的变量,这样你就不会有丢失任何数据的风险。只需在需要时声明您需要的东西。如果您已完成它以确保C#清理它,如果您担心内存限制,请将其归零。
答案 4 :(得分:0)
说到机器语言,在注册表级别,我认为最好与注册表大小保持一致,因为大多数移动和算术功能都是在注册表边界完成的。如果机器具有32位注册表集,则最好与32位对齐。如果机器具有用于I / O操作的16位注册表,则最好与16位对齐以减少移动内容时的操作数。