【问题标题】:Does using small datatypes reduce memory usage (From memory allocation not efficiency)?使用小数据类型是否会减少内存使用(来自内存分配而不是效率)?
【发布时间】:2014-08-18 13:13:34
【问题描述】:

实际上,我的问题与one 非常相似,但该帖子仅关注 C#。最近看到一篇文章说java会在内存中将一些短类型(比如short)“提升”到4个字节,即使有些位没有使用,所以不能减少使用。 (是真的吗?

所以我的问题是语言,尤其是 C、C++ 和 java(正如 Manish 在此 post 谈到 java 中所说)如何处理小型数据类型的 内存分配 . 参考或任何方法来找出它是首选。谢谢

【问题讨论】:

  • 如果您的问题是:int8 类型使用的内存是否比 int32 少?是的,确实如此,因为 int8 只使用 1 个字节,而 int32 使用 4 个字节。
  • 数据类型的大小只在结构和数组中很重要。大多数语言会将值“提升”为 32-64 位以便进行计算,这仅仅是因为这是寄存器大小。
  • @Matt 在实践中并不是很准确。检查 Manish 链接的问题和答案。
  • @Manish 我不是说性能或效率,只是从内存分配来看。

标签: java c++ c memory-management


【解决方案1】:

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

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

这适用于大多数处理器的性能。通常有诸如“pack”和“align”之类的编译指示可用于更改对齐或禁用它。

【讨论】:

  • 取决于该 5 字节字符数组之后的位置。如果是更多字符,则不需要填充,但如果它是 32 位整数,它将向上移动到下一个 4 字节边界,因此 char 数组后面的 3 个字节未被使用。
  • 那么有没有关于这个的参考资料?
【解决方案2】:

在 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++ bitsets 和 vector<bool> 这样的数据类型可能比 bool 的数组更有效(它可能对每个元素使用 int,但在 C++03 标准中未指定)。`

猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多