quarta-feira, 4 de julho de 2012

Variáveis anônimas no C++

Procurando por uma referência de uma app que baixei pro meu novo celular com android ;D~, na dropdown do google aparece "c++ anonymous objects", como nunca tinha visto isso resolvi ver quais seriam os resultados.
O primeiro resultado que aparece é do learncpp, esse: http://www.learncpp.com/cpp-tutorial/814-anonymous-variables-and-objects/, no texto o autor fala:

Quando a expressão nX + nY é avaliado, o resultado é colocado em uma variável anónima e sem nome. Uma cópia da variável anónima é retornado para o chamador por valor.

Então é criado uma variável anônima? Como sou muito curioso resolvi por a prova.

Compilei as seguintes funções usando o compilador GCC 4.6.1 sem nenhum parâmetro de aumento de performace:

int add(int x, int y)
{
    return x + y;
}
int add2(int x, int y)
{
    int tmp = x + y;
    return tmp;
}

Eis seus códigos em máquina:

// add(int x, int y)
PUSH EBP
MOV EBP,ESP
MOV EAX,DWORD PTR SS:[EBP+0C]
MOV EDX,DWORD PTR SS:[EBP+8]
ADD EAX,EDX
POP EBP
RETN

// add2(int x, int y)
PUSH EBP
MOV EBP,ESP
SUB ESP,10
MOV EAX,DWORD PTR SS:[EBP+0C]
MOV EDX,DWORD PTR SS:[EBP+8]
ADD EAX,EDX
MOV DWORD PTR SS:[EBP-4],EAX
MOV EAX,DWORD PTR SS:[EBP-4]
LEAVE
RETN

Agora cadê a variável criada no add(int x, int y)? Se olharmos bem no registrador EAX é posto o valor y, no EDX é posto o valor x e por final é adicionado EDX ao EAX, só isso!

No add2(int x, int y) acontece o mesmo, mas só que no final há uma referência a nossa variável int tmp, após os cálculos a variável tmp vai pra pilha MOV DWORD PTR SS:[EBP-4, EAX e logo em seguida é colocada no registrador de retorno EAX.

Analizando meus dados acima é de fato que não existem variáveis anônimas (não no meu compilador), não as que ele disse. Mas pode ocorrer de existir, não sei, vai saber!

Att, Gilson Fabiano