编码时,我尽量不使用比需要更多的可变内存,这导致我编写这样的代码:
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?
答案 0 :(得分:4)
在大多数情况下,不会有任何内存使用差异,因为i
永远不会在内存中。 i
将存储在CPU寄存器中,您无法真正使用一个寄存器来存储两个变量。因此i
会占用一个注册,uint8
或uint32
并不重要。
在极少数情况下,i
实际上会存储在内存中,因为循环非常大,所以所有CPU寄存器都被占用。在这种情况下,您仍然很有可能获得任何内存,因为其他多字节变量将被对齐,而i
将跟随一些无用的填充字节以对齐下一个变量
现在,如果i
实际上存储在内存中,并且还有其他8位变量来填充填充,那么你可以节省一些内存,但它很少,所以不太可能不值得。性能方面,8位和32位之间的差异非常依赖于体系结构,但通常都是相同的。
此外,如果您在64位环境中工作,则此内存保存可能不存在,因为64位调用约定会在堆栈上强制执行大量16字节对齐(其中i
将如果它在内存中则存储。)