Pergunta

Eu estou tendo um problema chato com o meu iPhone app. Sempre que eu definir o nível de otimização para algo diferente de "None", eu recebo erros de cálculo. Isso só acontece quando construindo para o iPhone SDK (o iPhone Simulator é sempre bom).

Eu não me importaria desativando otimizações em modo de versão, mas a aplicação é um pouco muito lento quando eu faço isso.

A aplicação é complexa, por isso é difícil de localizar a parte que é também otimizado de forma agressiva.

Eu acho que o problema está no lado do GCC, uma vez que parece ter problema otimizar o código para a arquitetura ARM.

Existe uma maneira apenas para desativar optimizações apenas para determinados parte do código? Como você lidar com esse tipo de problema?

Foi útil?

Solução

Sim, isso é inteiramente possível. GCC tem um atributo para isso:

/* disable optimization for this function */
void my_function(void) __attribute__((optimize(0)));

void my_function(void) {
    /* ... */
}

Define o nível de otimização para essa função para -O0. Você pode ativar / desativar otimizações específicas:

/* disable optimization for this function */
void my_function(void) __attribute__((optimize("no-inline-functions")));

void my_function(void) {
    /* ... */
}

Outras dicas

Se a otimização muda o comportamento do seu programa, você pode inadvertidamente estar contando com um comportamento indefinido ou definido pela implementação. Poderia ser a pena dar uma olhada em seu código com um olho para suposições sobre valores das variáveis ??e ordens de avaliação.

Por favor verifique que você está returning corretamente os valores de suas funções. Na minha experiência, o seguinte só às vezes funciona:

int myFunc()
{
  x+7;
}

observe a omissão deliberada e inseguros do retorno palavra-chave

devido ao registo a ser utilizada no cálculo expressão sendo o mesmo que o registro de retorno.

Quando otimizações estão ligados, cadastre-se mudanças no uso e a função não consegue fazer o que quiser.

Verifique se o seu avisos do compilador.

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