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

时间:2015-05-21 14:41:35

标签: c gcc memory types compiler-optimization

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

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这样的编译器是否会在下面执行任何魔法/ juju?

1 个答案:

答案 0 :(得分:4)

在大多数情况下,不会有任何内存使用差异,因为i永远不会在内存中。 i将存储在CPU寄存器中,您无法真正使用一个寄存器来存储两个变量。因此i会占用一个注册,uint8uint32并不重要。

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

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

此外,如果您在64位环境中工作,则此内存保存可能不存在,因为64位调用约定会在堆栈上强制执行大量16字节对齐(其中i将如果它在内存中则存储。)