我想知道在C ++中处理内存大小是好还是坏。 这个问题让我很困惑(Why does mode_t use 4 byte?)。
因此,如果我不需要存储更大量的数据,那么仅使用char是不合适的,因为现代CPU必须填补其余部分? 因此,考虑性能和节省计算时间最好是始终对我需要的每个整数类型变量使用size_t? 如果我有一个大型数组,CPU是否仍然需要更多的指令来处理短值而不是处理size_t? char数组怎么样?他们不应该慢一点吗?
总而言之:什么是最佳做法?我想尽可能多地保存内存,因为我的服务器没有很多内存。另一方面,我不想放松表现,因为我认为记忆更重要。
在某些地方是否有一个很好的解释,说明这一切是如何运作的,在什么情况下会更快?
答案 0 :(得分:3)
这个问题没有一个答案。
减小所使用的整数类型的大小可以增加位置并减少所需的内存带宽。所以,这是一个加号。 (注意:实际的内存提取成本不低。)
增加您使用的整数类型的大小可以减少所需的转换次数。所以,这是一个加号。
所以问题是,选择#1会节省多少内存?通过选择#2来节省多少次转换?
一般来说,整个系统的分析不会告诉你哪个是更好的选择。这是因为回答有关内存压力降低的问题非常困难且系统特定。减少部分程序的内存使用量通常增加程序在该部分中花费的时间百分比 - 甚至可能会增加程序在整个系统上使用的时间百分比 - 要么到期对于大量必要的转换,或者因为内存压力降低会使系统的其他部分更快。因此需要整个系统分析。
毫不奇怪,这是一个真正的痛苦。
但是,我的直觉告诉我,尝试以这种方式最小化单个字段的内存使用量几乎是不值得的。你认为你的程序一次会在内存中有多少份mode_t
?少数,至多。所以我有一个经验法则:
如果它进入数组,则使用具有足够范围的最小类型。例如,字符串为char[]
而不是int[]
。
如果它出现在其他地方,请使用int
或更大。
所以我的主观回答是,把你宝贵的时间花在别的地方。您的时间很宝贵,除了选择字段是int
还是short
之外,还有更好的事情要做。
答案 1 :(得分:1)
这听起来像是过早优化。当你似乎还没有真正发生时,你担心内存耗尽。
通常,访问CPU本机字大小的一小部分会产生更多的CODE。因此,只需操作您关注的特定8位所需的添加CODE,您将数据保存为仅8位的空间可能会丢失50倍以上。您也可能会在“优化”减慢的地方结束:
struct foo {
char a1, a2, a3;
short b1;
};
如果上述结构被紧密打包,则b1跨越32位边界,在某些体系结构上会抛出异常,而在其他体系结构上则需要两次取出来检索数据。
或不。它取决于CPU架构,计算机的数据架构,编译器以及程序的典型使用模式。我怀疑在99%的时间里,有一个单一的“最佳实践”是正确的。
如果空间非常重要,请告诉编译器优化大小而不是速度,看看是否有帮助。但除非您通过缓慢的二进制管道共享数据,否则通常不应该关心它有多大,只要它足够大以容纳应用程序的所有有效值。
TL;博士?只需使用size_t,直到您可以证明减小特定变量的大小将显着提高服务器性能。
答案 2 :(得分:0)
您的答案取决于处理器:取决于目标平台的处理器。阅读其数据表,了解它如何处理单个8位读取。
ARM7TDMI处理器喜欢获取32位数量。这非常有效。它被标记为8/32处理器,也可以处理8位数量。
处理器可能能够直接获取8位数量,具体取决于它的连线方式。否则,它计算最近的32位对齐地址,读取32位并丢弃未使用的位。这需要处理时间。
所以权衡是内存与处理时间: