Copy constructor called from member function?

C

Craig Nicol

Hi,

Although I've been using C++ for a while, I've only recently started
writing my own template classes so forgive me if this is a silly question.

I have a matrix class, mgMatrix, that is templatised so that it can be a
matrix of any type. It has three data members, two integers for the
number of rows and columns in it, and a vector of size rows*columns to
hold all the data.

I am trying to test the speed of this class on a 10000*10000 matrix and
I am running into memory problems. Specifically when using my own +=
operator defined as:

template<class S> mgMatrix<T> operator+=(S scalar) {
std::transform(begin(), end(), begin(), std::bind2nd(std::plus<T>(),
scalar)); return *this; };

During testing, T=int and S=int (I use two types here to allow int
scalars to be added to double matrices), and scalar=0.

The memory error comes because this function calls the mgMatrix copy
constructor and the call to vector.resize(10000*10000) returns an
out-of-memory exception.

BTW, mgMatrix::begin() and mgMatrix::end() are wrappers for the vector
functions of the same name.

Can anyone tell me why the copy constructor is called from the above
function, when invoked as: testMatrix += 0;?

If required, I can post the full source code online.

Cheers,
Craig Nicol.
 
K

Karl Heinz Buchegger

Craig said:
Hi,

Although I've been using C++ for a while, I've only recently started
writing my own template classes so forgive me if this is a silly question.

I have a matrix class, mgMatrix, that is templatised so that it can be a
matrix of any type. It has three data members, two integers for the
number of rows and columns in it, and a vector of size rows*columns to
hold all the data.

I am trying to test the speed of this class on a 10000*10000 matrix and
I am running into memory problems. Specifically when using my own +=
operator defined as:

template<class S> mgMatrix<T> operator+=(S scalar) {
std::transform(begin(), end(), begin(), std::bind2nd(std::plus<T>(),
scalar)); return *this; };

During testing, T=int and S=int (I use two types here to allow int
scalars to be added to double matrices), and scalar=0.

The memory error comes because this function calls the mgMatrix copy
constructor and the call to vector.resize(10000*10000) returns an
out-of-memory exception.

BTW, mgMatrix::begin() and mgMatrix::end() are wrappers for the vector
functions of the same name.

Can anyone tell me why the copy constructor is called from the above
function, when invoked as: testMatrix += 0;?

return *this;

A temporary object is created, not used by the caller and gets destroyed.
 
V

Victor Bazarov

Craig said:
Although I've been using C++ for a while, I've only recently started
writing my own template classes so forgive me if this is a silly question.

I have a matrix class, mgMatrix, that is templatised so that it can be a
matrix of any type. It has three data members, two integers for the
number of rows and columns in it, and a vector of size rows*columns to
hold all the data.

I am trying to test the speed of this class on a 10000*10000 matrix and

That's a 100 million element matrix, and each element is what, a double?
That's 800 MB. Create a couple of those and you're likely to run out of
memory pretty quickly...
I am running into memory problems. Specifically when using my own +=
operator defined as:

template<class S> mgMatrix<T> operator+=(S scalar) {

Just like any other assignment operator, += should return a reference,
and not an object:

template said:
std::transform(begin(), end(), begin(), std::bind2nd(std::plus<T>(),
scalar)); return *this; };

During testing, T=int and S=int (I use two types here to allow int
scalars to be added to double matrices), and scalar=0.

The memory error comes because this function calls the mgMatrix copy
constructor and the call to vector.resize(10000*10000) returns an
out-of-memory exception.

Of course. You asked it to return another object of mgMatrix said:
BTW, mgMatrix::begin() and mgMatrix::end() are wrappers for the vector
functions of the same name.

Can anyone tell me why the copy constructor is called from the above
function, when invoked as: testMatrix += 0;?

Because you defined it as returning an object.
If required, I can post the full source code online.

Not required.

Victor
 
C

Craig Nicol

Victor said:
That's a 100 million element matrix, and each element is what, a double?
That's 800 MB. Create a couple of those and you're likely to run out of
memory pretty quickly...

That I realise. I'm stress-testing it to see how it falls over. If I
don't push it to the limits, I'm never going to test all the exceptions.
Better it fails now than when its embedded in another program.
Just like any other assignment operator, += should return a reference,
and not an object:

template<class S> mgMatrix<T>& operator +=(S scalar) { ...

That's the problem. Thanks for your help. Now I just need to get VC++ to
release it's lock on the *.pdb file :(

Cheers,
Craig Nicol.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top