Code Comments

Programming Forum and web based access to our favorite programming groups.
For Programmers: Free Programming Magazines
Registration is free! Edit your profileCalendarFind other membersFrequently Asked QuestionsSearch -> 
Post New Thread











Thread
Author

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.

Report this thread to moderator Post Follow-up to this message
Old Post
Craig Nicol
08-26-04 09:04 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

Report this thread to moderator Post Follow-up to this message
Old Post
Karl Heinz Buchegger
08-26-04 09:04 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

Report this thread to moderator Post Follow-up to this message
Old Post
Victor Bazarov
08-26-04 09:04 PM


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

Report this thread to moderator Post Follow-up to this message
Old Post
Craig Nicol
08-26-04 09:04 PM


Sponsored Links




Last Thread Next Thread Next
Search this forum -> 
Post New Thread

C++ archive

Show a Printable Version Send to friend Email This Page to Someone! subscribe to this thread Receive updates to this thread
Computer Consultants
Programming Jobs
Visual Basic Controls
SQL Server Programming
Webservices
Java Security
Visual Studio
C# Programming
Visual J++
Software engineering
Open source Software
Perl Programming
PHP Programming
ASP Programming
ASP .NET Programming
Visual Basic Programming
Windows Scripting Host
Java Programming
Java Help
Java Beans
VBScript
Cobol
MAC Applications
Unix Programming
Forum Jump:
All times are GMT. The time now is 04:17 AM.

 

Programming forum archive

Copyrights CodeComments.com 2004 - 2006

Powered by vBulletin Copyright 2000-2006 Jelsoft Enterprises Limited.