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

Согласно главе "Безопасность памяти" в Руководстве по языку программирования Swift (для Swift 4.2), есть предложение "Функция имеет долгосрочный доступ для записи ко всем своим входящим и исходящим параметрам". https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html

Я создал новый проект инструмента командной строки, чтобы проверить это в Xcode 10.1.

var stepSize = 1

func increment(_ number: inout Int) {
  print(stepSize)
}

increment(&stepSize)

Я ожидаю, что выходные данные будут равны 1, но фактическим выводом является журнал сбоев "Одновременный доступ к 0x100587430, но для модификации требуется исключительный доступ".

Я знаю, что это конфликт из-за доступа к параметрам ввода-вывода, но я не знаю, почему это происходит. Почему функция имеет долгосрочный доступ на запись ко всем входным и выходным параметрам?

1 ответ

Потребитель этого API видит func increment(_ number: inout Int), но не реализация. Можно только предположить, что increment(_:) делает записи в параметры, потому что может, в принципе.

Даже если реализация функции в настоящее время не выполняет никаких операций записи, такая возможность существует, поэтому компилятор должен принять наихудший сценарий. Представьте себе, если какой-то клиентский код был разрешен для компиляции, то это выглядит так, как будто он только для чтения (потому что в то время это может иметь место). Что должно случиться с клиентским кодом, когда кто-то добавляет number += 1 к функции тела?

Это похоже на наличие функции, которая объявляет, что может throwчья фактическая реализация не throw, Компилятор все еще рассматривает это как бросание, и требует, чтобы ошибка была обработана с некоторым вариантом try,

Другие вопросы по тегам