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
outofmemory 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.  
Share this Question
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 outofmemory 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  
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 outofmemory 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  
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 stresstesting 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.   This discussion thread is closed Replies have been disabled for this discussion.   Question stats  viewed: 1181
 replies: 3
 date asked: Jul 22 '05
