Initializing objects (instances of classes or structs) in C++ can be done in various ways. Some syntaxes evoke a direct-initialization of your object, other syntaxes lead to a copy-initialization. With copy-elision enabled in the compiler, both have identical performance. With copy-elision disabled, there is an additional copy/move constructor call upon every instantiation when you choose for the latter (copy-initialization).
Conclusion: copy-initialization can have a performance-penalty!
From the following question: C++11 member initializer list vs in-class initializer? I can conclude that this would be copy-initialization syntax:
obj s = obj("value");
And this would be direct-initialization syntax:
obj s{"value"};
But what about this one:
obj s = {"value"};
And this one:
obj s = obj{"value"};
And this one:
obj s("value");
Or this one:
obj s = "value";
NOTE
Bjarne Stroustrup compares a few initialization styles (but not all) in his book "Programming, Principles and Practice Using C++" 2nd edition, on page 311, §9.4.2:
struct Date {
int y,m,d; //year, month, day
Date(int y, int m, int d); //check for valid date and initialize
void add_day(int n); //increase the Date by n days
};
...
Date my_birthday; //error: my_birthday not initialized
Date today{12,24,2007}; //oops! run-time error
Date last{2000,12,31}; //OK (colloquial style)
Date next = {2014,2,14}; //also OK (slightly verbose)
Date christmas = Date{1976,12,24}; //also OK (verbose style)
Mr. Stroustrup presents these different initialization styles as equal. At least, that's how it looks to me. Nevertheless, it could still be possible that some are direct-initialization and others copy-initialization, since those terms are not yet discussed at that point in the book.
EDIT
The given answers bring up something interesting.
Apparently, this is direct-initialization:
obj s("value");
And this is direct-list-initialization:
obj s{"value"};
As some of you point out, there is a difference. In what way do they actually differ? Would the difference be noticeable in the output of a non-optimizing compiler?
See Question&Answers more detail:
os