Нет настоящей разницы.
Каждый современный компилятор (например, GCC, Clang, MSVC) оптимизирует любые различия между ними. Например, этот код:
struct Foo {
int foo = 1;
};
struct Bar {
int bar;
Bar(int value = 2) : bar(value) {}
};
void test() {
auto f = Foo();
auto b = Bar();
keep(b);
}
будет скомпилировано для этого GCC с самым низким уровнем оптимизации (-O1):
test():
mov eax, 1 // auto f = Foo();
mov eax, 2 // auto b = Bar();
ret
( Источник )
Таким образом, в обоих случаях весь вызов конструктора оптимизируется, и для каждой из них создается отдельная инструкция. (Результаты могут отличаться, но, как правило, то же самое имеет место для каждого компилятора.) Никакого прироста производительности не происходит, так или иначе.
Моя точка зрения заключается в том, что на самом деле нет никакого смысла в выполнении такого уровня ручной оптимизации, если у вас крайне нехватка ресурсов, поскольку компилятор почти всегда умнее вас и может оптимизировать их. вещи для скорости / памяти лучше, чем вы можете сделать вручную.
Вместо этого вы должны сделать свой выбор, основываясь на том, что вы считаете самым ясным кодом. Это единственная мысль, которая имеет значение здесь.