Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Copy constructor called from member function? (http://www.velocityreviews.com/forums/t285238-copy-constructor-called-from-member-function.html)

Craig Nicol 08-26-2004 03:13 PM

Copy constructor called from member function?
 
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.

Karl Heinz Buchegger 08-26-2004 03:31 PM

Re: Copy constructor called from member function?
 
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
kbuchegg@gascad.at

Victor Bazarov 08-26-2004 03:32 PM

Re: Copy constructor called from member function?
 
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

Craig Nicol 08-26-2004 04:09 PM

Re: Copy constructor called from member function?
 
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.


All times are GMT. The time now is 05:42 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.