These two day, I debugged a performance issue which is related to copy constructor: the class A
has a member b
which is NTL::ZZX type:
class A
{
enum class type {zzx_t, ...} t;
NTL::ZZX b;
......
}
When member t
‘s value is zzx_t
, b
is valid. Otherwise b
‘s content should be outdated.
There are 2
methods of implementing A
‘s copy constructor:
(1)
A(const A& other) : t(other.t), b(other.b)
{
......
}
In this method, NTL::ZZX
‘s copy constructor is called in spite of anything.
(2)
A(const A& other) : t(other.t)
{
......
if (t == zzx_t)
{
b = other.b;
}
.....
}
In this case, NTL::ZZX
‘s default constructor is called first. NTL::ZZX
‘s copy assignment operator is invoked only if “t == zzx_t
” condition is met.
NTL::ZZX
‘s default constructor nearly does nothing, and copy constructor does approximate work as copy assignment operator. But in our scenario, t
‘s value is not zzx_t
at 80
percent of the time. So the second implementation of copy constructor gets a big performance boost compared to first one.