Благодаря @malbarbo мы можем использовать эту вспомогательную функцию:
use std::convert::AsMut;
fn clone_into_array(slice: &[T]) -> A
where
A: Default + AsMut<[T]>,
T: Clone,
{
let mut a = Default::default();
>::as_mut(&mut a).clone_from_slice(slice);
a
}
, чтобы получить более синтаксис:
fn main() {
let original = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let e = Example {
a: clone_into_array(&original[0..4]),
b: clone_into_array(&original[4..10]),
};
println!("{:?}", e);
}
как T: Default + Clone
.
Если вы знаете, что ваш тип реализует Copy
, вы можете использовать эту форму:
use std::convert::AsMut;
fn copy_into_array(slice: &[T]) -> A
where
A: Default + AsMut<[T]>,
T: Copy,
{
let mut a = Default::default();
>::as_mut(&mut a).copy_from_slice(slice);
a
}
Оба варианта будут panic!
, если целевой массив и пропущенные ломтики не имеют одинаковой длины.
Нет это совершенно допустимо. Это также будет более эффективно, поскольку компилятор на самом деле может оптимизировать далеко временный файл.
Различие между примером Rob Walker называют Оптимизацией возвращаемого значения (RVO), если Вы хотите погуглить для него.
Кстати, если Вы хотите действовать, Ваш объект возвращается самым эффективным способом, создайте объект на "куче" (т.е. через новый) использование shared_ptr и возвратите shared_ptr вместо этого. Указатель получает возвращенные и подсчеты ссылок правильно.
Это допустимо, но производительность не может быть идеальной в зависимости от того, как это называют.
Например:
A a;
a = fn();
и
A a = fn();
не то же.
В первом случае конструктора по умолчанию называют, и затем оператор присваивания вызывается на, который требует, чтобы временная переменная была создана.
Во втором случае используется конструктор копии.
Достаточно интеллектуальный компилятор разработает, какая оптимизация возможна. Но, если конструктор копии является пользователем, предоставленным затем, я не вижу, как компилятор может оптимизировать временную переменную. Это должно вызвать конструктора копии, и сделать это это должно иметь другой экземпляр.
Возврат объектов от вызова функции является Шаблоном разработки "Фабрики" и используется экстенсивно.
Однако Вы захотите быть осторожными ли Вы эхо-сигналы или указатели на объекты. Бывшие из них представят Вас для копирования конструкторов / операторы присваивания, которые могут быть болью.
Это - совершенно легальный C++, и любой компилятор должен принять его. Что заставляет Вас думать, что это могло бы делать что-то не так?
Это - лучший способ сделать это, если Ваш класс довольно легок - я подразумеваю, что не очень дорого сделать копию из него.
Один побочный эффект того метода, хотя то, что он действительно имеет тенденцию делать его более вероятно, чтобы создать временные объекты, хотя это может зависеть от того, как хорошо компилятор может оптимизировать вещи.
Для большего количества тяжелых классов, что Вы хотите удостовериться, не копируются (скажите, например, что большое растровое изображение) затем это - хорошая идея передать материал как этот вокруг как параметр ссылки, который затем заполнен, только для создания абсолютно уверенным, что не будет никаких созданных временных объектов.
В целом это может произойти, что упрощение синтаксиса и создание вещей, превращенных более непосредственно, могут иметь побочный эффект создания более временных объектов в выражениях, просто что-то, что необходимо иметь в виду при разработке интерфейсов для большего количества тяжелых объектов.