19.04.2013 Views

Apostila antiga - The Cyan Programming Language

Apostila antiga - The Cyan Programming Language

Apostila antiga - The Cyan Programming Language

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

CHAPTER 5. OTIMIZAÇÃO DE CÓDIGO 72<br />

Isto significa que um ponteiro pode referenciar variáveis e áreas de memória de qualquer tipo.<br />

Deste modo, uma atribuição<br />

*p = 0;<br />

pode, potencialmente, alterar qualquer variável, vetor ou objeto, dificultando a realização de<br />

otimizações como eliminação de subexpressões comuns, propagação de variáveis e movimentação<br />

de expressões constantes para fora de laços.<br />

No exemplo<br />

void m( int *p, int i )<br />

{<br />

int a = i, b, c;<br />

if ( i > 0 ) p = &a;<br />

c = 3*a;<br />

*p = 5;<br />

b = 3*a;<br />

...<br />

}<br />

A subexpressão 3*a não pode ser calculada uma única vez porque o valor de a pode ser alterado<br />

entre as atribuições “c = 3*a” e “b = 3*a”. Se o endereço de uma variável for tomado, como<br />

em “p = &a”, deve-se admitir que o seu conteúdo pode ser modificado indiretamente. Observe<br />

que o uso de ponteiros não impede sempre o compilador de fazer otimizações, mas torna a análise<br />

do que é constante em um certo trecho de código muito difícil.<br />

Se a função m fosse definida como<br />

void m( int *p, int i )<br />

{<br />

int a = i, b, c;<br />

c = 3*a;<br />

b = 3*a;<br />

if ( i > 0 ) p = &a;<br />

*p = 5;<br />

...<br />

}<br />

a expressão 3*a poderia ser calculada uma única vez porque as atribuições a b e c precedem, no<br />

grafo de fluxo de execução desta função, à tomada de endereço de a.<br />

Se houver mais de um vetor como parâmetro, como em<br />

void q( int v[], int w[], int n )<br />

{<br />

int i = 0;<br />

v[0] = 3*w[0];<br />

a = 3*w[0];<br />

...<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!