java使用小型数据类型是否会减少内存使用(从内存分配而不是效率)?
事实上,我的问题与这个one非常相似,但这篇文章只关注C#。最近我读到一篇文章说,java将把一些短类型(如short)在内存中“升级”到4字节,即使某些位没有被使用,所以它不能减少使用。(这是真的吗?)
所以我的问题是语言,特别是C、C++和java(正如Manish在本post中谈到的java)如何处理小型数据类型的内存分配参考或任何方法都是首选。谢谢
你可以在下面搜索框中键入要查询的问题!
事实上,我的问题与这个one非常相似,但这篇文章只关注C#。最近我读到一篇文章说,java将把一些短类型(如short)在内存中“升级”到4字节,即使某些位没有被使用,所以它不能减少使用。(这是真的吗?)
所以我的问题是语言,特别是C、C++和java(正如Manish在本post中谈到的java)如何处理小型数据类型的内存分配参考或任何方法都是首选。谢谢
# 1 楼答案
C/C++仅使用指定的内存量,但会将数据(默认情况下)与某个值的倍数对齐,对于32位应用程序通常为4字节,对于64位应用程序通常为8字节
例如,如果数据在4或8字节的边界上对齐,“char”只使用一个字节。5个字符的数组将使用5个字节。但是在5字节字符数组之后分配的数据项被放置在一个跳过3个字节的地址,以保持正确对齐
这是为了提高大多数处理器的性能。通常有“pack”和“align”等杂注,可用于更改对齐方式或禁用对齐方式
# 2 楼答案
对于
T* p = (T*)malloc(n * sizeof(T));
或T* p = new T[n];
而言,数据将占用sizeof(T)*n
字节的内存,因此如果sizeof(T)
减少(例如,减少到int16_t
而不是int32_t
),则该空间将相应减少。这就是说,堆分配往往有一些开销,因此很少有大型分配比单个数据项或非常小的数组的大量分配更好,其中开销可能比sizeof(T)
中的微小差异更显著对于结构、静态和堆栈使用,填充比大型数组更重要,因为以下数据项可能属于不同类型,具有不同的对齐要求,从而导致更多的填充
在另一个极端,您可以应用位字段来有效地将值打包到所需的最小位数中-实际上是非常密集的压缩,尽管如果您想要显式控制,您需要依赖编译器pragmas/属性,但该标准未指定位字段何时在新内存“字”(例如,32位进程的32位内存字,64位进程的64位内存字)中开始,或在单独的字之间换行,在字中位保存数据与填充等。数据类型如C++ +{8CD8}和^ {CD9}}可能比^ {< CD10}}(对于每个元素都可以使用^ {< 1111}},但在C++ 03标准中未指定)更有效。p>