Pergunta

Na minha classe Ciência da Computação II, o professor considera ++, -, * =, etc. para ser 2 operações. No entanto, ao nível da Assembleia este não é realmente duas operações. Alguém pode explicar ou isso é apenas por uma questão de simplicidade?

Foi útil?

Solução

Eu realmente considero que seja 3 operações: leitura, de incremento (ou qualquer outro), de escrita. Isso supondo que está lendo de algum tipo de memória compartilhada em algum tipo de armazenamento local (por exemplo, registrar ou pilha), operando no armazenamento local, em seguida, escrever de volta.

Quantas operações é no nível de montagem vai depender do que você está incrementando, a plataforma, o hardware etc.

Outras dicas

Como ++ (ex: b ++) é uma simplificação da

b = b + 1 

Existem duas operações de lá, a adição (b + 1) e, em seguida, a atribuição do valor da adição à variável original.

Por que se preocupar quando se faz análise de complexidade? É apenas O (1): -)

EDIT: Por favor, deixe-me saber por que quando você votar para baixo. Dado que a questão é marcado complexidade , presumo grande noção O é o mais importante, em vez das constantes reais. Além disso, como já mencionado em outras respostas, quantas operações é depende de uma série de fatores: a maneira de contar as operações, plataforma, compilador, etc.

Estou indo jogar algumas suposições.

  • O seu professor está se referindo a linguagens interpretadas?
  • ++ i é diferente de i ++ talvez ele está se referindo a isso?
  • Talvez sua montagem lang de escolha precisa a variável de armazenamento intermediário?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    

Não é uma adição mais um setter?

Semelhante a i + = 1?

O prof é provavelmente apenas referindo-se a ter que tomar o valor, adicione 1 a ela e, em seguida, atribuí-lo de volta para a variável.

Ao nível da montagem tudo é feito em registros assim que ter uma variável em A

ADD AX,1

No entanto, em linguagens compiladas tudo tem que ser armazenados de forma i ++ torna-se (em pseudo assembly)

MOV AX,i
ADD AX, 1
MOV i, AX

O que é três operações ... A menos que eu tenha esquecido a minha arquitetura básica completamente ...

Você me fez lembrar de um kinda " Júri não está fora " problema que eu ouvi há muito tempo.

"preIncrement é mais rápido do que pós-incremento"

Eu apenas fiz uma rápida pesquisa google.

  1. Muitas pessoas ainda têm isso como verdade.
  2. Outros afirmam que os compiladores são tão otimizado, o código de código de alto nível comparativa não pode ser aferido.
  3. No entanto outras pessoas afirmam que não há diferença .

Ele deve ser superior a 2 na minha opinião uma vez que tem dois significados dependendo do contexto e eu sempre tenho que me lembrar deles quando eu vê-lo.

a = b++ é o mesmo que a = b; b = b + 1

e

a = ++b é o mesmo que b = b + 1; a = b

Este é o suficiente de uma confusão para enviar alunos mais do primeiro ano fora do penhasco.

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