By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,433 Members | 1,665 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,433 IT Pros & Developers. It's quick & easy.

Copy constructor called from member function?

P: n/a
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.
Jul 22 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Craig Nicol wrote:

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.
--
Karl Heinz Buchegger
kb******@gascad.at
Jul 22 '05 #2

P: n/a
Craig Nicol wrote:
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<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.
Of course. You asked it to return another object of mgMatrix<T> type.

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
Jul 22 '05 #3

P: n/a
Victor Bazarov wrote:
Craig Nicol wrote:
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...


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.
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<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.
Jul 22 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.