java 减少内存_关于Java:使用较小的数据类型是否会减少内存使用(从内存分配到效率)?...

实际上,我的问题与此非常相似,但该帖子仅关注C#。 最近,我读到一篇文章说,即使不使用某些位,Java也会在内存中将某些短类型(如short)"提升"为4个字节,因此它不能减少使用量。 (是真的吗?)

所以我的问题是语言,尤其是C,C ++和Java(如Manish在本文中谈到Java时)如何处理小数据类型的内存分配。 最好使用参考文献或任何解决它的方法。 谢谢

stackoverflow.com/questions/14531235/

如果您的问题是:int8类型使用的内存少于int32?是的,确实如此,因为int8仅使用1个字节,而int32使用4个字节。

数据类型的大小仅在结构和数组中有意义。大多数语言会将值"提升"为32-64位以便进行计算,这仅仅是因为那是寄存器的大小。

实际上,@ Matt并不十分准确。检查Manish链接的问题和答案。

@Manish我并不是说性能或效率,只是内存分配。

(通常,Java将为等于其理论大小的值分配位置。但是,如果在一个对象中有3个byte值,则JVM可能会将每个值都对齐在4字节边界上。对于数组,尽管(布尔值除外),实际上所有JVM都会按字节分配。)

@Tony Manish引用的问题(及相关答案)涵盖了性能和内存含义。内存使用率是此答案中首先要解决的问题:stackoverflow.com/a/14532302/676877

@BrettOkken和Manish感谢您的提醒。

C / C ++仅使用指定的内存量,但将数据(默认情况下)对齐为某个值的倍数的地址,对于32位应用程序通常为4字节,对于64位为8字节。

因此,例如,如果数据在4或8字节边界上对齐,则"字符"仅使用一个字节。 5个字符的数组将使用5个字节。但是将在5字节char数组之后分配的数据项放置在跳过3个字节以使其正确对齐的地址处。

这是为了提高大多数处理器的性能。通常存在一些杂物,例如" pack"和" align",可用于更改对齐方式或禁用对齐方式。

取决于5字节char数组之后的内容。 如果它的字符更多,则不需要填充,但是如果它像32位整数那样,它将被移至下一个4字节边界,因此char数组后的3个字节未被使用。

那么对此有何参考?

在C和C ++中,根据您对内存的请求方式,可以采用不同的方法。

对于T* p = (T*)malloc(n * sizeof(T));或T* p = new T[n];,数据将占用sizeof(T)*n字节的内存,因此如果减小sizeof(T)(例如减小为int16_t而不是int32_t),则该空间将相应减小。就是说,堆分配往往会产生一些开销,因此,对于单个数据项或非常小的数组而言,很少有大的分配要比大量分配要好,在这些分配中,开销可能比sizeof(T)中的细微差别大得多。

对于结构,静态和堆栈的使用,填充比大型阵列更重要,因为以下数据项可能是具有不同对齐要求的不同类型,从而导致更多的填充。

在另一种极端情况下,您可以应用位域将值有效地打包到所需的最小位数中—确实是非常密集的压缩,尽管如果需要显式控制,则需要依赖编译器的编译指示/属性-当在位域可能始于新的存储器"字"(例如,用于32位处理的32位存储器字,用于64的64位)或包裹在单独的字中,其中,在这些字中,位保存数据还是填充等。像C ++ bitset s和vector这样的数据类型可能比bool数组(它们可能对每个元素都使用int的数组,但是在C ++ 03 Standard中未指定)的效率更高。

请不要在C中强制转换malloc()的返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值