2009-10-25 53 views
5

我总是喜欢使用最小尺寸的变量,它可以正常工作,但是如果我使用短字节整数而不是整数,并且内存为32位字寻址,那么这真的会给我带来好处吗?编译器是否做了一些事情来增强内存使用情况 ?为什么使用小于32位的整数?

回答

11

对于局部变量,它可能没有多大意义,但在具有数千乃至数百万项目的结构中使用较小的整数时,可以节省大量的内存。

+1

FWIW,在32位模式的PC上,16位整型实际上可能比32位整型稍慢,因为机器操作码实际上需要额外的字节来指定它们使用16位操作数。因此,对于本地变量,如果它适用于您,则使用本地int类型。同样,对于结构,为了节省内存,可以使用最小尺寸的工作。您可能希望按照相同的大小对成员变量进行分组,但不要因为不同大小的成员变量之间的填充而浪费空间。 – Adisak 2009-10-25 21:19:45

+1

顺便说一句,这里有一篇名为'掌握C#中的结构'的文章,深入描述*完全*我在谈论如何分组类似的变量:http://www.vsj.co.uk/articles/display.asp?id= 501 – Adisak 2009-10-25 21:23:51

+0

我喜欢链接,非常翔实的 ,我想知道,我将如何获得与数组类似的收益,它会像结构? – 2009-10-25 23:28:08

4

不,int被选为mopdern 32/64位体系结构中最快的int类型,使用较短的(short,sbyte)类型只会降低性能。

有时您可以保存在内存中,但只能在使用大型数组或列表时使用。即使如此,它通常不支付。

计算与8位:

sbyte a, b, c; 
a = (sbyte) (b + c); 

的类型转换是必需的,携带一个运行时成本。

+0

任何意见与反对票? – 2009-10-25 21:46:27

+2

但是我们不在x86上运行(直接)。 C#为每个计算增加了字节和短路。 – 2009-10-25 21:49:43

+0

顺便说一句,我没有投票或投票你....我只是评论...但我猜downvote是你的答案是不完全正确的性能断言。此外,您可以在不仅仅是阵列或列表中的结构上节省大量内存。例如,我们研究大型3D世界的游戏,其中数十或数十万个物体松散地连接在有向图中(我们的游戏之一加载大约200,000个物体)。对于性能和内存而言,可变大小确实很重要。 – Adisak 2009-10-25 21:51:35

3

如果它是一个普通变量,使用较短的宽度将不会获得任何结果,并且某些性能可能会丢失。编译器会自动将存储器扩展为一个完整的处理器字,因此即使只声明16位,堆栈中也可能需要32位。另外,在某些情况下,编译器可能需要执行某些截断操作(例如,当该字段是结构的一部分时);这些可能会导致轻微的开销。

它真的只对结构和数组很重要,即如果你有很多值。对于一个结构体,你可以节省一些内存,代价是上面提到的开销。此外,如果结构需要遵循一些外部布局,则可能会被迫使用较小的尺寸。对于阵列来说,如果阵列很大,节省存储空间可能是相关的。

3

通常情况下,坚持int

除了其他的答案;还有一些情况是您故意只想支持给定的数据大小,因为它代表了关于数据的一些关键事实。这与外部系统(特别是互操作性数据库,文件格式等)交流时可能很关键,并可能与算术混合 - 尽早发现溢出。

2

说实话,内存消耗可能不是使用小整数(在这个例子中)的最有说服力的理由。但是有一个通用原则是说你应该只使用数据结构所需的内存。

原理是这样的,只分配数据所需的宽度,让编译器找到可能发生的任何溢出错误,这是一种非常有效的额外调试技术。如果你知道一个值不应该超过一个阈值,那么只能分配到该阈值。

相关问题