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

时间:2013-06-18 15:54:10

标签: c++ c char int short

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

了解我正在寻找的是这个例子:

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

在此指令中我知道 x 的值小于 11

我看过很多代码,大多数人声明 x 就像 int

为什么我们不应该或为什么大多数人不会像简短那样声明 x ,甚至不喜欢 char !!

我想到了原因,我发现了这个解释,例如:

short s=5;

s 在内存中占用2个字节,我所知道的是编译器将 5 视为 int 所以要 5 s 5 应该转换为吧!!

- &GT;所以这条指令需要更少的记忆但更多的工作

int i=5;

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

- &GT;所以这条指令工作量减少,但需要更多记忆

就像我想的那样!!

我希望我的问题很清楚

7 个答案:

答案 0 :(得分:16)

如果您必须在内存中存储数百万个数字,并且每个数字可能介于0到11之间,那么您将关注内存。在循环中,变量很可能存储在CPU寄存器中,这意味着它在x86上为32位,在x86_64上为32到64位等。所有“较小”整数将零扩展为32或者64位。

int简单易读,因此很多人都使用它。但是如果你必须担心性能或者提示编译器有关大小约束,那么使用“(u)int_fast_ *”类型(即uint_fast8_t

答案 1 :(得分:9)

你在考虑事物的表面外观。现实与此不同。

例如,您担心循环变量占用的内存。但是,在许多循环中,循环变量永远不会存储在内存中。相反,它将被保存在寄存器中。 CPU中寄存器的数量是有限的,但变量不能占用寄存器的一半(通常是 - x86有点奇怪),所以无论你使用int,short还是char,你都可能失去一个完整的寄存器。所以你不要通过使变量变小来保存任何东西。

类似的是你的假设是,将一个整数文字分配给一个short需要更多的工作而不是一个int。这里的问题是假设编译器会生成在运行时进行某种转换的代码,这时只需生成代码就可以实现简单的事情(只是将文字存储到内存位置)。

答案 2 :(得分:8)

全部的最佳理由 - 可读性。如果我看到循环迭代shortchar,我会花一点时间来弄清楚原因。 int更直观,因为它是迭代最常用的类型(更多用于iteratorsize_t)。

答案 3 :(得分:5)

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

答案 4 :(得分:4)

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

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


    n1337中的
  1. §3.9.1/ 2,但是C和C ++的所有标准一直回到原始的ANSI C89标准,虽然章节数已经改变,但它们的措辞几乎完全相同。

答案 5 :(得分:1)

不,不完全。如果你有一个半合理的编译器,它将正确处理这个问题。如果您担心内存使用情况,请使用短片,并将其留在那里。

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

也请参阅this问题。

答案 6 :(得分:0)

当你需要为更大的数字循环时,你可能会遇到代码。比char甚至short可以容纳的次数多。这可能是您编写数据库类似系统的情况,其中循环虽然数量巨大。为了更安全,最好将循环变量作为'int'。还有一件事,如果你正在使用像Delay_ms()函数这样的循环,并且如果你试图将循环变量限制为char,你将必须有嵌套循环,或者调用相同的Delay_ms()一次又一次地运作。