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

时间:2014-06-27 12:15:01

标签: java c++ c memory-management

实际上,我的问题与此one非常相似,但帖子只关注C#。最近我读了一篇文章说java将会推广'即使没有使用某些位,内存中的一些短类型(如短)到4个字节,因此它不能减少使用。 (是真的吗?

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

2 个答案:

答案 0 :(得分:4)

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

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

这是为了在大多数处理器上实现性能。通常有pragma喜欢" pack"和"对齐"可用于更改对齐或禁用它。

答案 1 :(得分:0)

在C和C ++中,可能会采取不同的方法,具体取决于您如何请求内存。

对于T* p = (T*)malloc(n * sizeof(T));T* p = new T[n];,数据将占用sizeof(T)*n字节的内存,因此如果sizeof(T)减少(例如int16_t而不是{{} 1}})那么空间相应减少。也就是说,堆分配往往会产生一些开销,因此很少有大型分配比单个数据项或非常小的数组的大量分配更好,其中开销可能比int32_t中的小差异更重要。 / p>

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

在另一个极端,你可以应用位域来有效地将值打包到他们需要的最小位数 - 确实非常密集的压缩,但如果你想要显式控制你需要依赖编译器编译指/属性 - 标准离开它当一个位域可能在一个新的内存中开始时,未指定&#34; word&#34; (例如32位进程的32位存储器字,64位64位存储器字)或包裹在单独的字中,其中字位保存数据与填充等。像C ++ sizeof(T)bitset这样的数据类型可能比vector<bool>的数组更有效(对于每个元素可能使用bool,但它未指定在C ++ 03标准中).`