2015-05-21 66 views
3

当编码,我尽量不使用多变量的内存比需要的现象,导致我写这样的代码:8位的int VS在32位architechture 32位的int(GCC)

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

代替:

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

上的8位微专时编码(uint8而不是int因为i只需要到最多32个)

这将使意义cessor。但是,如果在32位微处理器上运行此代码(其中int可能是16位或32位),我是否可以保存所有资源?当我在32位体系结构中明确使用8bit int时,像GCC这样的编译器是否会在其下执行任何魔术/ juju?

+0

Salut!你有没有试过看在不同的架构上生成的程序集?也许这可以提供一些有关这方面的见解? – Eregrith

+1

如果你是从微观优化的角度来问这个问题的话,你可以玩像intfast8_t这样的东西。 – Mysticial

+0

它是'zoozoo',而不是'juju' ... :-) –

回答

4

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

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

现在,如果i实际上存储在内存中,并且还有其他8位变量来填充填充,那么可以节省一些内存,但是它很少,所以不太可能,因此可能不值得。在性能方面,8位和32位之间的差异非常依赖于架构,但通常情况相同。另外,如果您在64位环境中工作,则此存储器保存可能不存在,因为64位调用约定在堆栈上施加了巨大的16字节对齐方式(其中i将存储在if它在内存中)。

+0

我看了看生成的汇编代码,两者都是相同的(计数器变量在CPU寄存器中,如您所述)谢谢 – ananio