为小循环计数器选择什么数字类型

What numeric type to choose for small loop counters?

本文关键字:数字 类型 什么 选择 小循环 计数器      更新时间:2023-10-16

考虑int占用4个字节的内存。

要了解我在寻找什么,请举这个例子:

for(x=0;x<10;x++) //do something

x的值小于11, 我看过很多代码,大多数人把x声明成int

为什么我们不应该或者为什么大多数人不把x声明为,甚至像字符一样!!

我在原因中思考,我找到了这样的解释,例如:

short s=5;

s占用2个字节的内存,我所知道的是编译器将5视为int所以要把5转换成s5应该转换成短的右!!

->所以这条指令占用更少的内存,但更多的工作

int i=5;

这里i占用4字节,但不需要对话(5是一个int)

->所以这个指令做更少的工作,但占用更多的内存

的原因就像我想的那样!!

我希望我的问题是清楚的

如果你必须在内存中存储数百万个数字,每个数字可以在0到11之间,那么你会关心内存。在循环中,变量很可能存储在CPU寄存器中,这意味着它在x86上是32位,或者在x86_64上是32到64位,等等。

int简单易读,所以很多人使用它。但是,如果你必须担心性能或提示编译器关于大小约束,那么使用"(u)int_fast_*"类型(即uint_fast8_t .

你对事物的表面外观考虑太多了。现实并非如此。

例如,您担心循环变量占用的内存。然而,在许多循环中,循环变量永远不会存储在内存中。相反,它将被保存在寄存器中。CPU中的寄存器数量是有限的,但是变量不能占用寄存器的一半(通常- x86在这方面有点奇怪),所以无论您使用int、short还是char,都可能丢失一个完整的寄存器。因此,将变量变小并不会节省任何内容。

类似的假设是,将整型文字赋值给short类型比赋值给int类型需要更多的工作。这里的问题是假设编译器会在运行时生成执行某种转换的代码,而实际上,首先生成执行简单操作的代码要简单得多(只需将文字存储到内存位置)。

最好的理由——可读性。如果我看到一个循环在shortchar上迭代,我会花一点时间找出原因。int更直观,因为它是迭代使用最多的类型(甚至比iteratorsize_t使用得更多)。

有时通过选择小于int的算术类型来微优化内存使用是有意义的。但这是有代价的,因为在形式上,该值被提升为int以对其进行算术处理,然后再转换回较小的类型。int是目标平台的自然大小,所以几乎总是最好使用它,特别是因为每个未来的维护者都必须弄清楚为什么有人编写了如此不自然的代码。

"纯整型具有执行环境体系结构所建议的自然大小"1,这意味着在典型情况下,纯整型是对处理器施加的操作和处理工作量最少的类型。简而言之,int是您在没有充分理由使用其他类型时通常希望使用的默认类型。

还请注意,在引用的情况下,使用shortchar所减少的内存使用可能完全是虚幻的。在典型情况下,我们可以期望在寄存器中分配一个循环索引变量,因此无论我们关心多少位,该变量在任何情况下都基本上占用整个寄存器。如果它不在寄存器中,它通常会在堆栈上,并且在大多数情况下堆栈上的项的大小也是固定的(32位体系结构为32位,64位体系结构为64位等),因此分配单个char(例如)可以/将经常最终使用与int一样多的内存。


    在n1337中
  1. §3.9.1/2,但是所有C和c++的标准一直追溯到最初的ANSI C89标准,几乎都有相同的措辞,尽管小节号已经改变了。

不,不完全是。如果你有一个半合理的编译器,它将正确地处理这个问题。如果你担心内存的使用,可以使用一个简短的。

int可能更好,因为它通常是寄存器的大小。这在某些CPU架构上可能更有效。

参见这个问题。

您可能会遇到需要循环获取较大no的代码。比char甚至short所能容纳的时间还要多。这可能是在为数据库之类的系统编码时出现的情况,其中循环涉及大量数据。为了安全起见,最好将循环变量设为'int'。还有一件事,如果您正在为Delay_ms()函数之类的东西使用这样的循环,并且如果您试图将循环变量限制为char,则必须有嵌套循环,或者一次又一次地调用相同的Delay_ms()函数。