32 位架构 (GCC) 上的 8 位 int 与 32 位 int

8 bit int vs 32 bit int on a 32 bit architechture (GCC)

在编码时,我尽量不使用比需要更多的变量内存,这导致我编写如下代码:

for (uint8 i = 0; i < 32; i++) {
   ...
}

而不是:

for (int i = 0; i < 32; i++) {
   ...
}

(uint8 而不是 int 因为 i 只需要上升到 32)

在 8 位微处理器上编码时,这很有意义。但是,如果 运行 此代码在 32 位微处理器上(其中 int 可能是 16 位或 32 位),我是否节省了任何资源?当我在 32 位架构上显式使用 8 位 int 时,像 GCC 这样的编译器会在下面做任何 magic/juju 吗?

在大多数情况下,不会有任何内存使用差异,因为 i 永远不会在内存中。 i会存放在一个CPU寄存器中,你不可能真的用一个寄存器存放两个变量。所以 i 将占用一个寄存器, uint8uint32 无关紧要。

在极少数情况下,i实际上会存储在内存中,因为循环太大以至于所有CPU寄存器都被占用了。在这种情况下,你仍然很有可能不会获得任何内存,因为其他多字节变量将被对齐,并且 i 后面将跟随一些无用的填充字节来对齐下一个变量。

现在,如果 i 实际存储在内存中,并且还有其他 8 位变量来填充填充,您可能会节省一些内存,但它太小而且不太可能,它可能不是'不值得。在性能方面,8 位和 32 位之间的差异非常依赖于体系结构,但通常是相同的。

此外,如果您在 64 位环境中工作,这种内存节省可能是不存在的,因为 64 位调用约定在堆栈上强加了一个巨大的 16 字节对齐(其中 i 如果它在内存中,将被存储)。