微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

select整数types的大小有什么好的指导?

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

当我在内存有限的embedded式设备上进行编程时,我通常习惯于使用最小的整数/浮点types来完成这项工作,例如,如果我知道计数器总是在0到255之间我将把它声明为uint8_t 。

但是,在更less的内存限制环境中,我习惯于仅仅使用int来表示一切,按照Google C ++ Styleguide 。 当我看现有的代码时,往往会这样做。

清楚的是,我得到了这样做的基本原理,(Google解释得非常好),但是我并不十分清楚以第一种方式做事的原理。

我的代码改进

数百个空闲线程的影响

什么是在Windows上编写轻量级GUI程序的最快途径?

Java文件I / O性能随时间减less

通过线程提高磁盘读取性能(多个文件

在我看来,即使在不关心内存使用情况的系统上,减less程序的内存占用量对整体速度也是有好处的,因为从逻辑上讲,整体数据的减less意味着更多可以装入cpucaching。

但是,复杂的事情是,编译器会自动填充数据并将其与边界alignment,以便在单个总线周期中获取数据。 那么,我想,编译器是否足够聪明,可以采取两个32位整数,并将它们集中在一个64位块中,而将每个整理为64位。

我猜想cpu本身是否可以利用这一点也取决于其内部的确切内部,但是优化内存大小可以提高性能的想法,特别是在新型处理器上,这一事实certificate了Linux内核在gcc上依赖一段时间 -0s选项可以提升整体性能

所以我想我的问题是为什么Google方法似乎在实际代码中更为普遍。 这里有隐藏的成本,我失踪了吗?

在Linux上需要关于C语言中multithreading分析的思想

Java中的multithreading:不同的操作系统提供不同的性能

C ++应用程序作为一种高性能的服务

PHP5-FPM随机开始消耗大量的cpu

何时为I / O(C ++)构build自己的缓冲区系统?

通常使用“google方法”的常见原因是因为int通常是足够好的,而且它通常是初学者材料中的第一个选项。 它还需要更多的努力(工时等)来优化“有限的内存”的不平凡的代码 – 如果不是实际需要的话,这是毫无意义的。

如果“实际代码”是为可移植性编写的,那么int是一个很好的认选择。

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

“有限的内存”编程当然很常见,但通常不会写大多数代码。 不少现代嵌入式系统具有足够的内存和其他资源,所以这些技术并不总是需要它们的。

为你所谓的“有限的内存”编写的许多代码也并不需要。 当程序员学到更多东西时,有一点需要注意,即使没有证明需要这样做,一大群人开始沉迷于不成熟的优化 – 担心性能或内存使用。 虽然由于真正的需要,肯定有大量代码被写入“有限的内存”,但由于过早的优化,写了很多这样的代码

“嵌入式设备…零和255之间的计数器,我会宣布它为uint8_t”

这可能会适得其反。 特别是在嵌入式系统上,8位读取可能会比较慢。 此外,柜台可能在登记册内,而使用半个登记册则没有任何好处。

使用uint8_t主要原因是当你有一组连续的。 可以是一个数组,也可以是一个class相邻成员。

正如评论已经注意到的那样, -Os是不相关的 – 它的好处是在较小代码的情况下,内存总线具有更多的数据带宽。

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

“正确,简单,清晰是第一位的。”

最重要的是, 了解这些不到10%的代码在哪里,真的需要优化。 否则,保持接口简单和统一。

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

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

至于所有优化:查看编译器生成代码,测量操作实际执行多长时间,并在需要时查找堆/堆栈上的内存消耗。 如果您的硬件仍然有MBytes,那么手工编写不可维护的代码将在某处保存8位是没有意义的。

使用像valgrind这样的工具和目标/编译器所支持的分析功能,可以在这里进行理论讨论。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐