Почему в анализе сложности ++ считается двумя операциями?

StackOverflow https://stackoverflow.com/questions/443423

Вопрос

На моем курсе информатики II профессор рассматривает ++,--,*= и т. д.будет 2 операции.Однако на уровне Ассамблеи это не две операции.Может кто-нибудь объяснить или это просто для простоты?

Это было полезно?

Решение

Я бы на самом деле считал, что это 3 операции: чтение, увеличение (или что-то еще), запись. При этом предполагается, что он считывает данные из некоторой разделяемой памяти в некое локальное хранилище (например, регистр или стек), работает в локальном хранилище, а затем записывает обратно.

Сколько операций выполняется на уровне сборки, будет зависеть от того, что вы увеличиваете, платформы, оборудования и т. д.

Другие советы

Потому что ++ (например: b ++) - это упрощение

b = b + 1 

Здесь есть две операции: сложение (b + 1) и затем присвоение значения сложения исходной переменной.

Зачем беспокоиться при анализе сложности? Это просто O (1): -)

РЕДАКТИРОВАТЬ: Пожалуйста, дайте мне знать, почему, когда вы проголосуете. Поскольку вопрос помечен тегом сложность , я предполагаю, что понятие большого О является наиболее важным, а не фактическими константами. Кроме того, как уже упоминалось в других ответах, количество операций зависит от множества факторов: от того, как вы считаете операции, от платформы, от компилятора и т. Д.

Я выскажу несколько предположений.

  • Ваш профессор имеет в виду интерпретируемые языки?
  • ++i отличается от i++, может быть, он имеет в виду это?
  • Может быть, его выбранному языку ассемблера нужна переменная промежуточного хранения?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    

Разве это не дополнение плюс сеттер?

Похоже на i + = 1?

Проф, вероятно, просто ссылается на необходимость взять значение, добавить 1 к нему и затем присвоить его обратно переменной.

На уровне сборки все выполняется в регистрах, поэтому переменная находится в A

ADD AX,1

Однако в скомпилированных языках все должно храниться, поэтому i ++ становится (в псевдосборке)

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

Это три операции ... Если я полностью не забыл свою основную архитектуру ...

Вы напомнили мне своего рода " Жюри не вышло " проблема, которую я слышал давно.

  

" Предварительный инкремент быстрее, чем postincrement "

Я только что сделал быстрый поиск в Google. <Ол>

  • Многие люди все еще считают это правдой.
  • Другие утверждают, что компиляторы настолько оптимизированы, что сравнительный код высокого уровня не может быть сравнен.
  • Тем не менее другие люди утверждают, что нет никакой разницы .
  • По моему мнению, оно должно быть больше 2, поскольку оно имеет два значения в зависимости от контекста, и я всегда должен напоминать себе о них, когда вижу это.

    a = b ++ совпадает с a = b; b = b + 1

    и

    a = ++ b совпадает с b = b + 1; a = b

    Этого достаточно, чтобы сбить с толку большинство первокурсников.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top