据我所知,不是处理器字长的整数值在修改它们时会被提升(使用 +、-、& 等)。类型应该是字长。在我的编译器上,是32-bit并且是64-bit。long
int
long
这是否意味着long
比尽管需要更多内存更有效?int
还有一件事,复合运算符是否也促进了价值观?那么递增和递减运算符呢?
据我所知,不是处理器字长的整数值在修改它们时会被提升(使用 +、-、& 等)。类型应该是字长。在我的编译器上,是32-bit并且是64-bit。long
int
long
这是否意味着long
比尽管需要更多内存更有效?int
还有一件事,复合运算符是否也促进了价值观?那么递增和递减运算符呢?
没关系,这不是你能控制的。选择最窄的类型,它的宽度足以代表您需要的值。这是你在任何情况下都能做到的最好的。
语言保证操作的结果是正确的,编译器会选择它可以找到的最有效的路径。这可能涉及在某个阶段更改整数大小,也可能不会。
处理器可以进行自己的内部转换。同样,不改变结果。再次,它不在你的手中。
任何人都很难给你一个直截了当的答案。在这种情况下,您能做的最好的事情就是自己分析和查看。
但除非你用这些数字进行数百万次操作,否则我怀疑哪个更快会很重要。首先编写可读代码,然后进行分析和优化。
我还听说拥有一个if (int)
而不是更快,if (bool)
因为它bool
会被提升为int
(违反直觉,我知道),但是没有人为了性能而声明一个int
而不是一个。bool
(除非,也许,在分析之后)
原则上, plainint
应该是“快速,正常使用的整数”,而long
,当不同时,可以表示“扩展范围但可能更慢”。
实际发生的事情很大程度上取决于您正在使用的平台。
在我使用的几个微控制器int
上是 16 位和long
32 位,并且操作long
需要多个处理器指令。在“经典”32 位 x86 上,long
通常int
是相同的,所以根本没有区别。在 x86_64 上,取决于可移植性问题,long
可能是 32 位或 64 位;就“执行操作的指令数”而言,它们是相同的,但如果您必须在内存中读取/存储大整数数组(32 位整数可能表现更好,因为更适合缓存),则增加的大小可能很重要(并且可能你可以做很多考虑,优化通常是违反直觉的,尤其是在 x86 上)。
所以,长话短说:不要过度考虑这个问题,如果您需要一个保证快速工作的“正常”整数并且它的范围对您的应用程序来说是可以的,只需使用int
. 如果您需要最小保证大小,请查看typedef
s <stdint.h>
(除了为您提供精确大小的整数外,它还提供“具有此最小大小的最快整数”)。
但与往常一样,通常的规则适用:如果您有性能问题首先配置文件,然后优化。
这是否意味着尽管需要更多内存,但 long 比 int 更有效?
这完全取决于您的计算机。没有一种完美的整数类型是普遍最优的。如果它对性能至关重要,则需要使用一些分析工具进行检查。如果它对性能不重要,你不应该关心。