В какой степени Rust отслеживает нулевую стоимость? - PullRequest
0 голосов
/ 01 апреля 2020

Смешанный список с нулевой средой выполнения и стоимостью в Rust описывает, как создать гетерогенный список в Rust, используя кортежи и обычные признаки (не объекты признаков, такие как этот вопрос предлагает). Кажется, что список сильно зависит от теневого копирования и эффективно меняет весь тип списка каждый раз, когда добавляется новый элемент.

Реализация кажется мне гениальной, но после просмотра нескольких домашних страниц и ресурсов Rust я не смог найти нигде, где бы явным образом определялось затенение как нулевая стоимость. Насколько я знаю, многократное оставление данных в стеке обходится дешевле, чем косвенное, но многократное копирование и добавление к существующим данным вместо их изменения звучит довольно дорого.

То, что вы не используете, вы не платите. И еще: что вы используете, вы не могли бы передать код лучше.

  • Бьярн Страуструп

Затенение, кажется, выполняет первое требование, но секунда?

Является ли затенение Руста фактически нулевой стоимостью?

1 Ответ

8 голосов
/ 01 апреля 2020

Официальный материал Rust очень старается никогда не говорить о «нулевой стоимости» сам по себе, поэтому вам придется цитировать, где вы видите «нулевую стоимость» без дальнейшей квалификации. В статье указано ноль времени выполнения стоимость, поэтому автору поста об этом известно. В большинстве случаев «нулевая стоимость» используется в контексте абстракций с нулевой стоимостью .

Ваша цитата Страуструпа лишь частично и косвенно имеет дело с абстракциями с нулевой стоимостью. Лучшее объяснение, выделение мое:

Это означает, что вы не платите штраф за абстракцию , или сказано иначе, это означает, что вы используете абстракцию или вместо go для «ручная» реализация, в итоге вы получаете те же затраты (та же скорость, то же потребление памяти, ...).

Это означает, что каждый раз, когда вы видите «абстракцию с нулевой стоимостью», вы должны иметь что-то, чтобы сравнить абстракцию с ; только тогда вы можете сказать, действительно ли это нулевая стоимость.

Я не думаю, что затенение даже считается абстракцией , но давайте притворимся, что это так (и я скажу остальное моего ответа, как будто я верю, что это так).

Затенение переменной означает наличие нескольких различных переменных с одним и тем же именем, причем более поздние исключают доступ к предыдущим. Не «абстрактная» версия этого имеет несколько различных переменных с разными именами. Я бы сказал, что две переменные с одинаковым именем равны стоимости , как две переменные с разными именами, поэтому это абстракция с нулевой стоимостью.

См. Также:


Продолжая игру, вы можете спросить:« Имеет ли две переменные абстракцию с нулевой стоимостью? ». Я бы сказал, что это зависит от того, что за переменные и как они связаны.

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

fn example() {
    let a = String::new();
    let a = a;
}

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

fn example() {
    let a = String::new();
    let a = String::new();
}

Лучшим способом написать это было бы позвонить drop посередине. Существуют веские причины, по которым Rust этого не делает, но это не , а неэффективно в отношении использования памяти, поскольку может быть написана рукописная реализация.

См. Также:

...