有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用小型数据类型是否会减少内存使用(从内存分配而不是效率)?

事实上,我的问题与这个one非常相似,但这篇文章只关注C#。最近我读到一篇文章说,java将把一些短类型(如short)在内存中“升级”到4字节,即使某些位没有被使用,所以它不能减少使用。(这是真的吗?

所以我的问题是语言,特别是C、C++和java(正如Manish在本post中谈到的java)如何处理小型数据类型的内存分配参考或任何方法都是首选。谢谢


共 (2) 个答案

  1. # 1 楼答案

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

    例如,如果数据在4或8字节的边界上对齐,“char”只使用一个字节。5个字符的数组将使用5个字节。但是在5字节字符数组之后分配的数据项被放置在一个跳过3个字节的地址,以保持正确对齐

    这是为了提高大多数处理器的性能。通常有“pack”和“align”等杂注,可用于更改对齐方式或禁用对齐方式

  2. # 2 楼答案

    在C和C++中,根据你如何请求内存,可以采用不同的方法。p>

    对于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>