Официальный материал 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 этого не делает, но это не , а неэффективно в отношении использования памяти, поскольку может быть написана рукописная реализация.
См. Также: