Apostila antiga - The Cyan Programming Language
Apostila antiga - The Cyan Programming Language
Apostila antiga - The Cyan Programming Language
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
CHAPTER 5. OTIMIZAÇÃO DE CÓDIGO 66<br />
}<br />
...<br />
i = getValor() + 1;<br />
é otimizado para<br />
...<br />
i = valor + 1;<br />
Em C++, funções que devem ser substituídas em linha podem ser declaradas com a palavra<br />
chave inline, como mostrado acima.<br />
Pode acontecer de haver chamadas recursivas entre as rotinas “inline”. Neste caso, uma das<br />
rotinas não pode ser expandida.<br />
Alguns compiladores expandem em linha funções de bibliotecas como memset, strlen, strcpy,<br />
etc. Mesmo que o usuário não declare alguma função como inline em C++, ela poderá ser<br />
expandida automaticamente pelo compilador.<br />
Esta otimização é muito importante. Tipicamente, 40% do tempo de execução de um programa<br />
é gasto em chamadas de subrotinas. Cada chamada envolve: a) passagem de parâmetros, b)<br />
empilhamento do endereço de retorno, c) salto para a função, d) salvamento e inicialização de<br />
um registrador que permitirá manipular as variáveis locais e) alocação das variáveis locais f)<br />
destruição das variáveis locais g) salto para o endereço de retorno.<br />
Entre e) e f) acontece a execução do corpo da função. Quando uma função for colocada em<br />
linha, os passos b)-g) e talvez a) serão eliminados. Esta otimização é particularmente importante<br />
porque parte considerável das funções é chamada apenas uma única vez em todo o programa.<br />
Assim, o uso intensivo desta otimização pode até tornar o programa menor.<br />
3. Recursão de Cauda (Tail Recursion)<br />
Quando existir uma chamada de procedimento recursivo ao fim da execução do procedimento,<br />
esta poderá ser substituída por um desvio incondicional para o início do procedimento.<br />
int E2 ()<br />
{<br />
if ( lex->token == mais_smb ) {<br />
lex->nextToken();<br />
cout token == menos_smb ) {<br />
lex->nextToken();<br />
cout