Pergunta

Será que a otimizar compilador quaisquer multiplicações por 1? Ou seja, considerar:

int a = 1;
int b = 5 * a;

Será que a expressão 5 * a ser otimizado para apenas 5? Se não, será que se um é definido como:

const int a = 1;
Foi útil?

Solução

Ele irá pré-calcular quaisquer expressões constantes quando ele compila, incluindo concatenação. Sem o const que vai ser deixado sozinho.

seu primeiro exemplo compila para esta IL:

.maxstack 2
.locals init ([0] int32, [1] int32)

ldc.i4.1   //load 1
stloc.0    //store in 1st local variable
ldc.i4.5   //load 5
ldloc.0    //load 1st variable
mul        // 1 * 5
stloc.1    // store in 2nd local variable 

O segundo exemplo compila para isso:

.maxstack 1
.locals init ( [0] int32 )

ldc.i4.5 //load 5 
stloc.0  //store in local variable

Outras dicas

propagação constante é um dos mais comum e otimizações mais fáceis.

Olhando para o código gerado pelo compilador mono, a versão com o não-const um executa a multiplicação no tempo de execução. Ou seja, a multiplicação não é otimizado para fora. Se você fizer uma const, em seguida, a multiplicação é otimizado para fora.

O compilador Microsoft pode ter um compilador mais agressiva, a melhor solução é olhar para o código gerado pelo compilador para ver o que está fazendo.

O que o compilador otimizar aqui não é a multiplicação por 1 per-se, mas sim aritmética com valores conhecidos em tempo de compilação. Então, sim, um compilador otimizar todas as contas no seu exemplo, com ou sem a const.

Editar:. A competente compilador, devo dizer

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top