我一直在寻找,我还没有真正想出答案。
当我在内存有限的嵌入式设备上进行编程时,我通常习惯使用最小的积分/浮点类型来完成这项工作,例如,如果我知道计数器总是介于两者之间零和255,我将其声明为uint8_t
。
但是,在内存受限较少的环境中,根据Google C++ Styleguide,我习惯只使用int
来处理所有内容。当我查看现有代码时,通常会以这种方式完成。
要明确的是,我得到了这样做的理由,(Google解释得非常好),但我并不清楚第一种做法背后的理由。
在我看来,即使在不关心内存使用的系统上,减少程序的内存占用也会对整体速度有利,因为从逻辑上讲,较少的整体数据意味着更多可能适合CPU缓存。
然而,使问题复杂化的是编译器将自动填充数据并将其与边界对齐,以便可以在单个总线周期中获取数据。我想,那么,它归结为编译器是否足够聪明,比如两个32位整数,并将它们组合在一个64位块中,而不是单独填充每一个到64位。我认为CPU本身是否可以利用它还取决于其确切的内部结构,但是优化内存大小提高性能的想法,特别是在较新的处理器上,可以从Linux内核{{3在gcc的-0s
选项中提升整体性能。
所以我猜我的问题是为什么Google方法在实际代码中似乎更为普遍。这里有隐藏的成本我不知道吗?
答案 0 :(得分:2)
通常的原因是" google方法"通常使用的是因为int
通常足够好,并且它通常是初学者材料中教授的第一个选项。它还需要更多的努力(工时等)来优化非平凡的代码以限制内存和#34; - 如果不是真的需要,这是毫无意义的努力。
如果"实际代码"是为了便携性编写的,那么int
是一个很好的默认选择。
无论是否为可移植性而编写,许多程序只能在具有足够内存资源且具有int
类型的主机上运行,该类型可以表示所需的值范围。这意味着没有必要担心内存使用情况(例如,根据需要支持的特定值范围来优化变量的大小),程序才能正常工作。
编程"有限的记忆"当然很常见,但通常不是为什么大多数代码都是编写的。相当多的现代嵌入式系统拥有足够的内存和其他资源,因此并不总是需要这些技术。
为你所谓的内容而写的很多代码"有限的内存"实际上也不需要。有一点,程序员了解更多,大量开始沉迷于过早优化 - 担心性能或内存使用,即使没有证明他们需要这样做。虽然肯定会有大量的代码写入"有限的内存"由于真正的需要,由于过早的优化,会编写更多这样的代码。
答案 1 :(得分:0)
根据我的经验,较大项目中90%的代码不需要特别优化,因为所有内存消耗和所有执行时间的95%花费的时间不到您编写的代码的10%。在其余代码中,尝试强调简单性和可维护性。大多数情况下,这意味着使用ints
或size_t
作为整数类型。通常,不需要优化局部变量的大小,但如果在大型数组中有很多类型的实例,则可以有意义。 Herb Sutter和Andrei Alexandrescu出版的优秀书籍 C ++编码标准:101规则,指南和最佳实践(C ++深度)中的第6项说:
“首先是正确,简洁和清晰。”
最重要的是,了解这些代码不到10%的位置,真正需要优化。否则,请保持接口简单统一。
答案 2 :(得分:0)
如果你真的只需要16位或更少,那么在你可能拥有16位总线接口的ARM上使用int也是一个非常糟糕的主意。
对于所有优化:查看编译器生成的代码,测量操作实际需要多长时间,并在必要时查找堆/堆栈上的内存消耗。如果你的硬件还剩下MBytes,手工制作不可维护的代码来保存8位是没有意义的。
使用像valgrind这样的工具和目标/编译器支持的分析,可以在这里提供更多的理论讨论。
没有一般的"最佳整数类型"!它总是取决于CPU架构,内存总线,缓存等等。