Code Comments
Programming Forum and web based access to our favorite programming groups.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.
Post Follow-up to this messageCraig 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
kbuchegg@gascad.at
Post Follow-up to this messageCraig 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
Post Follow-up to this messageVictor Bazarov wrote:
> Craig Nicol wrote:
>
>
>
> 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.
Post Follow-up to this messagePowered by vBulletin
Copyright 2000-2006 Jelsoft Enterprises Limited.