选择整数类型大小有哪些好的指导原则?

时间:2016-08-14 01:22:20

标签: c++ c linux performance memory

我一直在寻找,我还没有真正想出答案。

当我在内存有限的嵌入式设备上进行编程时,我通常习惯使用最小的积分/浮点类型来完成这项工作,例如,如果我知道计数器总是介于两者之间零和255,我将其声明为uint8_t

但是,在内存受限较少的环境中,根据Google C++ Styleguide,我习惯只使用int来处理所有内容。当我查看现有代码时,通常会以这种方式完成。

要明确的是,我得到了这样做的理由,(Google解释得非常好),但我并不清楚第一种做法背后的理由。

在我看来,即使在不关心内存使用的系统上,减少程序的内存占用也会对整体速度有利,因为从逻辑上讲,较少的整体数据意味着更多可能适合CPU缓存。

然而,使问题复杂化的是编译器将自动填充数据并将其与边界对齐,以便可以在单个总线周期中获取数据。我想,那么,它归结为编译器是否足够聪明,比如两个32位整数,并将它们组合在一个64位块中,而不是单独填充每一个到64位。

我认为CPU本身是否可以利用它还取决于其确切的内部结构,但是优化内存大小提高性能的想法,特别是在较新的处理器上,可以从Linux内核{{3在gcc的-0s选项中提升整体性能。

所以我猜我的问题是为什么Google方法在实际代码中似乎更为普遍。这里有隐藏的成本我不知道吗?

3 个答案:

答案 0 :(得分:2)

通常的原因是" google方法"通常使用的是因为int通常足够好,并且它通常是初学者材料中教授的第一个选项。它还需要更多的努力(工时等)来优化非平凡的代码以限制内存和#34; - 如果不是真的需要,这是毫无意义的努力。

如果"实际代码"是为了便携性编写的,那么int是一个很好的默认选择。

无论是否为可移植性而编写,许多程序只能在具有足够内存资源且具有int类型的主机上运行,​​该类型可以表示所需的值范围。这意味着没有必要担心内存使用情况(例如,根据需要支持的特定值范围来优化变量的大小),程序才能正常工作。

编程"有限的记忆"当然很常见,但通常不是为什么大多数代码都是编写的。相当多的现代嵌入式系统拥有足够的内存和其他资源,因此并不总是需要这些技术。

为你所谓的内容而写的很多代码"有限的内存"实际上也不需要。有一点,程序员了解更多,大量开始沉迷于过早优化 - 担心性能或内存使用,即使没有证明他们需要这样做。虽然肯定会有大量的代码写入"有限的内存"由于真正的需要,由于过早的优化,会编写更多这样的代码。

答案 1 :(得分:0)

根据我的经验,较大项目中90%的代码不需要特别优化,因为所有内存消耗和所有执行时间的95%花费的时间不到您编写的代码的10%。在其余代码中,尝试强调简单性和可维护性。大多数情况下,这意味着使用intssize_t作为整数类型。通常,不需要优化局部变量的大小,但如果在大型数组中有很多类型的实例,则可以有意义。 Herb Sutter和Andrei Alexandrescu出版的优秀书籍 C ++编码标准:101规则,指南和最佳实践(C ++深度)中的第6项说:

  

“首先是正确,简洁和清晰。”

最重要的是,了解这些代码不到10%的位置,真正需要优化。否则,请保持接口简单统一。

答案 2 :(得分:0)

好的讨论!但我想知道为什么没有人谈论cpu寄存器大小,内存总线架构,cpu架构等。说" int是最好的"根本不是一般的。如果您有像8位avr这样的小型嵌入式系统,那么对于从0 ... 255运行的计数器来说,int是一个非常糟糕的选择。

如果你真的只需要16位或更少,那么在你可能拥有16位总线接口的ARM上使用int也是一个非常糟糕的主意。

对于所有优化:查看编译器生成的代码,测量操作实际需要多长时间,并在必要时查找堆/堆栈上的内存消耗。如果你的硬件还剩下MBytes,手工制作不可维护的代码来保存8位是没有意义的。

使用像valgrind这样的工具和目标/编译器支持的分析,可以在这里提供更多的理论讨论。

没有一般的"最佳整数类型"!它总是取决于CPU架构,内存总线,缓存等等。