В чем разница между использованием ключевого слова box и Box:: new?

Является ли box просто синтаксическим сахаром или может применяться для случаев, когда Box::new недостаточно? Я где-то читал, что box нестабилен, означает ли это, что я могу использовать его только в ночных версиях Rust?

Ответ 1

Box::new - это просто функция, как и любая другая функция. Это не является чем-то особенным. Он грязный и слабо пахнет сыром с очень близким сроком годности.

box - это волшебство и составило изначальные пикси и мечты маленьких детей. Он одет в самую прекрасную, шикарную одежду и несет с собой слабый аромат свежесрезанной сосны.

Когда вы выполняете Box::new(e), потому что это функция, e должен быть полностью оценен и сконструирован, прежде чем он сможет начать вызов. Если это означает выделение и заполнение структуры 500kB в стеке, тогда он должен выделить и заполнить структуру 500kB в стеке, а затем передать это на Box::new, который только тогда может выделить пространство в куче (что может быть неудачно), а затем скопируйте 500kB в кучу.

Когда вы выполняете box e, потому что это замечательно, как прохладный ветерок в жаркий летний день, компилятор может изменить порядок вещей, так что он начинается с выделения 500 КБ в куче и затем заполнения структуры 500 КБ непосредственно на куча. И затем это сделано. Никакое дополнительное копирование, отсутствие жевания через пространство стека. Не тратьте впустую усилий, если это "распределить на кучу" не получится.

box - жизнь, box - любовь; все град box!

(И да, с момента написания, это все еще нестабильно, что означает, что вам нужен ночной компилятор, чтобы погреться в его сиянии. Но скоро наступит рассвет. Получите это? Рассвет? Ночь?... Я покажу себя вне...)