With is code, I've got the following output:
A::A() is called
test #1
A::A(const A & other) is called
test #2
A::A(const A & other) is called
A::A(const A & other) is called
test #3
A::A(const A & other) is called
A::A(const A & other) is called
A::A(const A & other) is called
When debugging the code, for the 3 test cases, I found that the 1st invocation to copy constructor is the same (and I think it makes sense): make a copy of the object and push to the vector.
However, additional invocation to the copy constructor is made through "_Umove_if_noexcept".
For test #2, when vec already has ONE entry, it will further invoke ONE time of the copy constructor.
For test #3, when vec already has TWO entry, it will further invoke TWO times of the copy constructor.
This is reproducible on Visual Studio 2017 and gcc 5.4.0.
Why is this happening? Is there a performance issue?
Thanks
#include <iostream>
#include <vector>
class A
{
public:
//constructor
A()
{
a = 10;
std::cout << "A::A() is called" << std::endl;
}
//copy constructor
A(const A& other) : a(other.a)
{
std::cout << "A::A(const A & other) is called" << std::endl;
}
//assignment operator
A& operator=(const A& other)
{
std::cout << "A::operator=(const A & other) is called" << std::endl;
a = other.a;
return *this;
}
public:
int a;
};
int main()
{
std::vector<A> vec;
//A::A() is called
A a;
std::cout << "test #1" << std::endl;
//A::A(const A & other) is called by push_back
vec.push_back(a);
std::cout << "test #2" << std::endl;
//A::A(const A & other) is called
//A::A(const A & other) is called from _Umove_if_noexcept
vec.push_back(a);
std::cout << "test #3" << std::endl;
//A::A(const A & other) is called
//A::A(const A & other) is called from _Umove_if_noexcept
//A::A(const A & other) is called from _Umove_if_noexcept
vec.push_back(a);
std::cin.get();
return 0;
}