1

我想知道在 C++ 中处理内存大小是好事还是坏事。这个问题让我很困惑(为什么 mode_t 使用 4 字节?)。

因此,如果我不需要存储大量数据,只使用 char 并不高效,因为现代 CPU 必须填满其余数据?因此,考虑性能和节省计算时间的最佳方法是始终对我需要的每个整数类型变量使用 size_t 吗?如果我有一个大数组,CPU 是否仍然需要更多指令来处理短值而不是处理 size_t?char 数组呢?他们不应该也更慢吗?

总而言之:最佳实践是什么?我想尽可能多地节省内存,因为我的服务器没有很多内存。另一方面,我不想失去性能,因为我认为记忆更重要。

有没有什么地方可以很好地解释这一切是如何工作的,以及在什么情况下什么会更快?

4

3 回答 3

3

这个问题没有一个答案。

  1. 减小您使用的整数类型的大小可以增加局部性并减少所需的内存带宽。所以,这是一个加号。(注意:实际的内存获取成本并不低。)

  2. 增加您使用的整数类型的大小可以减少所需的转换次数。所以,这是一个加号。

所以问题是,选择#1 可以节省多少内存?选择 #2 可以节省多少转化?

客观的回答

一般来说,只有整个系统的分析会告诉你哪个是更好的选择。这是因为回答有关降低内存压力的问题非常困难,而且是特定于系统的。减少部分程序的内存使用量通常会增加程序在该部分中花费的时间百分比——甚至可能会增加程序在整个系统上使用的时间百分比——这可能是因为需要进行大量转换,或者因为减少的内存压力使系统的其他部分更快。因此需要对整个系统进行分析。

不出所料,这是一种真正的痛苦。

主观回答

但是,我的直觉告诉我,尝试以这种方式最小化单个字段的内存使用几乎是不值得的。mode_t你认为你的程序一次在内存中会有多少个副本?最多一把。所以我有一个经验法则:

  1. 如果它进入一个数组,则使用具有足够范围的最小类型。例如,字符串char[]代替int[].

  2. 如果它去其他任何地方,使用int或更大。

所以我的主观回答是,把你宝贵的时间花在别处。int您的时间很宝贵,您有比选择一个字段应该是还是更好的事情要做short

于 2013-01-02T21:28:31.453 回答
1

这听起来像是过早的优化。当看起来还没有实际发生时,您会担心内存不足。

通常,访问 CPU 原生字长的一小部分会生成更多的 CODE。因此,仅将数据放入 8 位中所节省的空间可能会因仅操作您关心的特定 8 位所需的添加代码而丢失 50 倍以上。您也可能会遇到“优化”也会减慢速度的地方:

struct foo {
    char a1, a2, a3;
    short b1;
};

如果上面的结构紧凑,b1 跨越 32 位边界,在某些架构上会抛出异常,而在其他架构上需要两次提取来检索数据。

或不。这取决于 CPU 架构、计算机的数据架构、编译器以及程序的典型使用模式。我怀疑这里有一个 99% 的时间都是正确的“最佳实践”。

如果空间真的很重要,告诉编译器优化大小而不是速度,看看是否有帮助。但是,除非您通过慢速二进制管道共享数据,否则您通常不应该关心它有多大,只要它大到足以容纳您的应用程序的所有有效值即可。

tl;博士?只需使用 size_t 直到您可以证明减小该特定变量的大小将显着提高服务器性能。

于 2013-01-02T21:26:00.667 回答
0

您的答案取决于处理器:取决于目标平台的处理器。阅读其数据表以了解它如何处理单个 8 位取指。

ARM7TDMI 处理器喜欢获取 32 位的数量。这样做非常有效。它被标记为 8/32 处理器,也可以处理 8 位数量。

处理器可能能够直接获取 8 位数量,具体取决于它的连接方式。否则,它会计算最接近的 32 位对齐地址,读取 32 位并丢弃未使用的位。这需要处理时间。

所以权衡是内存与处理时间:

  • 将应用程序压缩为使用 8 位会显着增加处理时间吗?
  • 您的开发计划是否因这项任务而获得时间?(又名投资回报率,ROI)
  • 您的客户是否抱怨应用程序的大小?
  • 在担心内存使用之前,您的应用程序是否正确无误?
于 2013-01-02T21:26:52.453 回答