Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Benefits of Initialization lists

Of what I know of benefits of using initialization list is that they provide efficiency when initializing class members which are not build-in. For example,

Fred::Fred() : x_(whatever) { }

is preferable to,

Fred::Fred() { x_ = whatever; }

if x is an object of a custom class. Other than that, this style is used even with built-in types for the sake of consistency.

The most common benefit of doing this is improved performance. If the expression whatever is the same type as member variable x_, the result of the whatever expression is constructed directly inside x_ — the compiler does not make a separate copy of the object.

With the other style, the expression whatever causes a separate, temporary object to be created, and this temporary object is passed into the x_ object's assignment operator. Then that temporary object is destructed at the ;. That's inefficient.

Question
Is there any efficiency gain in the following example with using initialization list. I think there is no gain. The first version calls string's copy constructor and the other calls string's assignment operator (there isn't any temporary thats created). It that correct?

class MyClass { public:     MyClass(string n):name(n) { } private:     string name; };  class MyClass { public:     MyClass(string n)     {         name=n;     } private:     string name; }; 
like image 258
TL36 Avatar asked Oct 21 '09 06:10

TL36


People also ask

Is initialization list faster?

Conclusion: All other things being equal, your code will run faster if you use initialization lists rather than assignment.

Why initialization list is used in C++?

Initialization lists allow you to choose which constructor is called and what arguments that constructor receives. If you have a reference or a const field, or if one of the classes used does not have a default constructor, you must use an initialization list.

What is an initialization list in C++?

The initializer list is used to directly initialize data members of a class. An initializer list starts after the constructor name and its parameters.

What is a member initializer list?

Member initializer list is the place where non-default initialization of these objects can be specified. For bases and non-static data members that cannot be default-initialized, such as members of reference and const-qualified types, member initializers must be specified.


2 Answers

The second version is calling string's default ctor and then string's copy-assignment operator -- there could definitely be (minor) efficiency losses compared to the first one, which directly calls c's copy-ctor (e.g., depending on string's implementation, there might be useless allocation-then-release of some tiny structure). Why not just always use the right way?-)

like image 68
Alex Martelli Avatar answered Sep 23 '22 08:09

Alex Martelli


I think the only way to initialize const data members is in the initialization list

Eg. in the header:

class C {     C(); private:     const int x;     int y; } 

And the in the cpp file:

C::C() :     x( 10 ),     y( 10 ) {     x = 20; // fails     y = 20; } 
like image 28
pxb Avatar answered Sep 22 '22 08:09

pxb