12

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

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

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

在这个指令中,我知道x的值小于11

我看过很多代码,大多数人将x声明为int

为什么我们不应该或者为什么大多数人不将x声明为short甚至像char

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

short s=5;

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

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

int i=5;

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

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

是像我想的那样的原因!

我希望我的问题很清楚

4

7 回答 7

16

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

int简单易读,所以很多人使用它。但是,如果您必须担心性能或提示编译器有关大小限制,请使用“(u)int_fast_*”类型(即uint_fast8_t.

于 2013-06-18T16:02:25.417 回答
9

您对事物的表面外观考虑太多了。现实与此不同。

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

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

于 2013-06-18T16:01:03.390 回答
8

最好的理由 - 可读性。如果我看到一个循环遍历 ashort或 a char,我会花一些时间找出原因。Anint更直观,因为它是迭代中最常用的类型(甚至更多地使用iteratoror size_t)。

于 2013-06-18T15:57:46.880 回答
5

通过选择小于int. 但这是有代价的,因为从形式上讲,值被提升为对其int进行算术运算,然后转换回较小的类型。int是目标平台的自然大小,因此几乎总是使用它更好,特别是因为每个未来的维护者都必须弄清楚为什么有人会写出如此不自然的代码。

于 2013-06-18T15:59:36.850 回答
4

“纯整数具有执行环境架构所建议的自然大小” 1,这意味着在典型情况下,纯整数是对处理器进行操作和使用的工作量最少的类型。简而言之,int当您没有充分的理由使用其他东西时,它通常是您想要使用的默认类型。

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


  1. n1337 中的第 3.9.1/2 节,但所有 C 和 C++ 标准一直追溯到原始 ANSI C89 标准的措辞几乎相同,尽管部分编号已更改。
于 2013-06-18T16:17:20.203 回答
1

不,不完全。如果你有一个半合理的编译器,它会正确处理这个问题。如果您非常担心内存使用情况,请使用short,然后将其保留。

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

也看到这个问题。

于 2013-06-18T15:58:09.900 回答
0

当您需要循环获取更大的编号时,您可能会遇到代码。比 achar甚至 a所能承受的时间要多得多short。当您为类似数据库的系统进行编码时,可能会出现这种情况,其中循环虽然数量很大。为了更安全,最好将循环变量作为'int'。还有一件事,如果你将这样的循环用于Delay_ms()函数之类的东西,并且如果你试图将循环变量限制为char,你将不得不有嵌套循环,或者Delay_ms()一次又一次地调用相同的函数。

于 2013-06-18T16:03:10.300 回答