Собирает ли функция чистого и nothrow, которая не передает память, автоматически мусор?
Предположим, у вас есть функция в D, которая pure
а также nothrow
и его тип возвращаемого значения и типы аргумента не могут пропускать никакую вновь выделенную память. Могу ли я добавить @nogc
приписать этой функции тогда? Если нет, есть ли вероятность, что это будет возможно в будущем?
Здесь я хочу сказать следующее: поскольку у функции нет видимых побочных эффектов, вся память, выделенная на пути, может быть детерминированно освобождена при выходе из функции. Следовательно, GC на самом деле не требуется, поскольку можно избежать шага метки и развертки. Или нет?
2 ответа
Вы всегда можете попробовать добавить @nogc
и составление. Чистая функция может по-прежнему выделять внутренние буферы, даже если она не возвращает ни одного из них, поэтому вопрос сбора мусора находится на другой оси, нежели чистота.
Если он проходит компиляцию с @nogc
, он не будет выделять (и, следовательно, не собирать, D GC будет собирать только когда вы попросите выделить) независимо от чистоты.
https://dlang.org/spec/attribute.html
... означает, что эта функция не выделяет память в куче GC, как напрямую, например, с помощью NewExpression, так и косвенно через функции, которые она может вызывать, или через функции языка, такие как конкатенация массивов и динамические замыкания.
Он ничего не говорит о состоянии GC после выполнения функции или общего увеличения использования памяти. Единственное, что имеет значение, это то, что сама функция гарантированно никогда не вызовет какие-либо функции выделения GC, то есть вы могли бы надежно создать и запустить такую функцию с пользовательской средой выполнения, в которой реализация GC вообще не связана.
Другим важным моментом является то, что @nogc
оптимизации не могут быть затронуты, потому что один и тот же действительный код должен продолжать компилироваться с разными уровнями оптимизации и разными компиляторами. Любая такая оптимизация должна стать обязательной в спецификации языка до того, как @nogc
может использовать это.
Учитывая все вышесказанное, ваша описанная функция может стать действительной @nogc
аннотация только тогда, когда применяются оба следующих условия:
- он вообще не делает никаких вызовов GC, он полностью оптимизирован
- такая оптимизация является обязательной и гарантируется, что она всегда будет происходить в таких случаях для всех совместимых компиляторов согласно спецификации языка
Я считаю это крайне маловероятным.