Собирает ли функция чистого и 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 аннотация только тогда, когда применяются оба следующих условия:

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

Я считаю это крайне маловероятным.

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